我有以下代码来随机化随机访问迭代器(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个元素。
我在这里有几个问题:
请参阅:我正在使用以下编译器:Microsoft Visual Studio Enterprise 2019(版本16.2.1)。操作系统平台是64位基于x64的处理器。我在Debug x86环境上构建。 Windows版本是Windows 10 Pro
答案 0 :(得分:3)
您的步骤是正确的,但这仅是因为:
int
在您的系统上恰好是4个字节 std::vector<int>::iterator
恰好在您的系统上 代替对值4进行硬编码,您可以使用int*
来在编译代码的任何系统上评估正确的字节数。
sizeof(int)
对于第二个问题,您正在计算的std::size_t numElements = (0x0080f9dc - 0x0080f9b8) / sizeof(int); // Better
不是无单位的十进制值。原始指针的原始整数值(请记住:36
细微地包装了std::vector<int>::iterator
,因此具有相同的大小)使用字节作为其隐式单位,因此您 are 实际上是除法在您的步骤中逐个字节。
最后,我建议避免这种指针算术(rationale)。该标准已经提供了一个std::distance
来精确计算该函数的功能,它将在所有标准迭代器以及您在其上编译代码的任何系统上正常工作。
int*