gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:43:41 35 4
gpt4 key购买 nike

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

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

  • 请参阅:我正在使用以下编译器:Microsoft Visual Studio Enterprise 2019(版本16.2.1)。操作系统平台是64位基于x64的处理器。我在Debug 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*,因此具有相同的大小)使用字节作为其隐式单位,因此实际上是在步骤中将字节除以字节。

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

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

    关于c++ - 对于C++随机访问迭代器( vector 迭代器),如何计算迭代器之间的差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59607594/

    35 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com