对于C ++随机访问迭代器(矢量迭代器,如何计算迭代器之间的差异?

问题描述 投票:0回答:1

我有以下代码来随机化随机访问迭代器(vector<int>::iterator)中的元素-

#include <vector>
#include <list>
#include <iterator>
#include <algorithm>
#include <stdlib.h>
#include <iostream>
using namespace std;

template<class RandomAccesIterator>
void randomize(RandomAccesIterator iterBegin, RandomAccesIterator iterEnd)
{
    while (iterBegin != iterEnd)
    {
        int rand1 = rand();
        auto iterdiff = iterEnd - iterBegin;
        auto secondarg = iterBegin + rand1 % (iterdiff);
        iter_swap(iterBegin, secondarg);
        ++iterBegin;
    }
}

下面是main()函数:

int main()
{
    //container used as to apply algorithm to.
    list<int> List = {34,77,16,2,35,76,18,2,56};

    //randomize example.
    cout << "calling randomize on sorted vector: " << endl;
    List.sort();
    vector<int> temp(List.begin(), List.end());
    cout << "before randomize: " << endl;
    for (vector<int>::iterator it = temp.begin(); it != temp.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;

    randomize(temp.begin(),temp.end());
    cout << "after randomize: " << endl;
    for (vector<int>::iterator it = temp.begin(); it != temp.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl<<endl;
    return 0;
}

在随机化模板函数中,如何计算迭代器之间的差异(iterEnd-iterBegin)?

我在即时窗口中尝试了几件事,看起来像iterEnd-iterBegin是这样计算的(向量中有9个元素,下面的计算得出9)。我尝试使用vector<int>中的各种元素,并且每次答案都是正确的。该计算是我们第一次在while循环中遇到iterEnd-iterBegin(即针对向量中的9个元素):

在立即窗口中-

1。

iterEnd
{-33686019}
    [ptr]: 0x0080f9dc {-33686019}
    [Raw View]: {...}

2。

iterBegin
{2}
    [ptr]: 0x0080f9b8 {2}
    [Raw View]: {...}

3。

0x0080f9dc-0x0080f9b8 //iterEnd - iterBegin gives 36.
36

4。

36/4 //Dividing 36 by 4, since an integer is 4 bytes (we are iterating over a vector of integers).
9

[我还在vector<int>中尝试使用8个元素,并且相同类型的计算在上面的步骤4中导致了8个元素。

我在这里有几个问题:

  1. 我为获取向量中的元素数量而执行的步骤是否正确(上述步骤1.至4。)?
  2. 在上面的步骤4中,我将十进制的36除以4个字节。这如何给我正确的结果?如果我将36个字节除以4个字节,这将很有意义,那么这将给我9个元素。为什么用decimal 36除以4个字节可以得到正确的答案?

[请参阅:我正在使用以下编译器:Microsoft Visual Studio Enterprise 2019(版本16.2.1)。操作系统平台是64位基于x64的处理器。我在Debug x86环境上构建。 Windows版本是Windows 10 Pro

c++ iterator random-access
1个回答
0
投票

    您的步骤是正确的,但仅因为:
  • int在您的系统上恰好是4个字节长
  • [std::vector<int>::iterator恰好是系统上的原始指针(int *

代替对值4进行硬编码,您可以使用sizeof(int)在编译代码的
any系统上评估正确的字节数。

std::size_t numElements = (iterEnd - iterBegin) / sizeof(int); // Better

关于第二个问题,由于原始指针算术的语义,36不是一个无单位的十进制值(在这里适用,因为std::vector<int>::iterator等效于系统上的int *)。这种差异的“单位”是字节,因此您实际上将字节除以字节。

最后,我建议避免这种指针算术(rationale)。该标准已经提供了一个精确计算此函数的函数std::distance,它将在所有标准迭代器以及您在其上编译代码的任何系统上正常工作。

std::distance
© www.soinside.com 2019 - 2024. All rights reserved.