![](/img/trans.png)
[英]For Random Access Iterator (vector iterator), are the iterators C++ style pointers?
[英]For C++ Random Access Iterator (vector iterator), how is the difference between iterators calculated?
我有以下代碼來隨機化隨機訪問迭代器( 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;
}
在randomize模板函數中,迭代器之間的差異是如何計算的(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)。 操作系統平台是基於 x64 的 64 位處理器。 我正在 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*
所以它具有相同的大小)使用字節作為其隱含的單元,因此,實際上是將字節由字節在腳步。
最后,我建議避免這種指針運算( 基本原理)。 標准已經提供了一個函數來精確計算這個, std::distance
,它可以在所有標准迭代器和你編譯代碼的任何系統上正常工作。
std::size_t numElements = std::distance(iterBegin, iterEnd); // Best
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.