簡體   English   中英

對於C++ Random Access Iterator(向量迭代器),迭代器之間的差異是如何計算的?

[英]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 個元素。

我在這里有幾個問題:

  1. 我為獲取向量中的元素數量而執行的步驟是否正確(上面的步驟 1. 到 4.)?
  2. 在上面的第 4 步中,我將 36(十進制)除以 4 個字節。 這如何給我正確的結果? 如果我將 36 個字節除以 4 個字節,那么這將是有意義的,然后這將給我 9 個元素。 為什么將十進制 36除以 4 個字節給我正確答案?

請參閱:我正在使用以下編譯器: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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM