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



我有以下代码来随机化随机访问迭代器中的元素(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 是这样计算的(向量中有 9 个元素,下面的计算给出了 9 个(。我尝试了vector<int>中不同数量的元素,每次答案都是正确的。计算是我们第一次遇到 iterEnd - iterBegin 在 while 循环中(即向量中的 9 个元素(:

在即时窗口中 -

1.

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

阿拉伯数字。

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 个元素,这是有意义的。为什么十进制 36除以 4 个字节会给我正确的答案?

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

您的步骤是正确的,但只是因为:

  • int在您的系统上恰好有 4 个字节长
  • std::vector<int>::iterator碰巧在你的系统上包装一个原始指针(int*

您可以使用sizeof(int)来计算编译代码的任何系统上的正确字节数,而不是硬编码值 4。

std::size_t numElements = (0x0080f9dc - 0x0080f9b8) / sizeof(int);  // Better

至于你的第二个问题,你计算36不是无单位的十进制值。原始指针的原始整数值(请记住:std::vector<int>::iterator简单地包装int*,因此它具有相同的大小(使用字节作为其隐式单位,因此您实际上是在步骤中将字节除以字节。

最后,我建议避免这种指针算法(基本原理(。该标准已经提供了一个函数来准确计算这一点,std::distance,它将在所有标准迭代器和您编译代码的任何系统上正常工作。

std::size_t numElements = std::distance(iterBegin, iterEnd);  // Best

最新更新