2015-11-27 74 views
-1

我在做一些「C++ prime」的練習時遇到了問題,iterator end()有問題。所以我寫了一個測試文件,它的代碼如下:爲什麼迭代器從結尾()獲得的結果很奇怪?

int main (void) 
{ 
    vector<int> v(10); 
    auto c = v.end(); 
    return 0; 
} 

是什麼讓我驚喜的是c的值不是10,而是一個陌生的號碼。這裏是我的調試結果:

enter image description here

這是什麼問題的原因是什麼?這是由於編譯器?我使用「g ++ -g -Wall -std = C++ 14」來編譯。

+1

爲什麼'c'的值是10?它是一個迭代器,而不是一個數字,它甚至是一個「超過最後」的迭代器,對解引用無效。 – molbdnilo

+0

對於std :: vector <>,迭代器不是索引,它是一個指針。指針是一個指向內存中某個位置的數字。如果你想將它轉換爲索引,你需要從它減去v.begin():v.end() - v.begin(),那麼你會得到10,如你所料。 – BrunoLevy

+0

我們可以只考慮迭代器作爲指針還是它們之間有不同的東西?我只是C++的初學者,並在c之前使用過。 – lookfiresu123

回答

6

iterator::end指向容器中最後一個元素後面的位置。所以它指向的地址,在你的情況下,是之後的地址,是存儲你的vector的第10個元素的地址。

此外,看起來你正試圖訪問迭代器的值,它是指向它的內存中的地址。您需要dereference它才能獲得它指向(不適用於iterator::end)。

+0

地址不存儲10(我認爲你知道你在說什麼,但是你說這樣會讓提問者更容易混淆),請編輯! – BrunoLevy

+0

我說**是**之後的**。你錯過了那個點嗎? – CinCout

+0

不,這不是重點,我的意思是你的句子是「那個商店10」,地址不是*商店* 10。 – BrunoLevy

2

類型的v.end()std::vector<int>::iterator。基本上,矢量迭代器是指向該矢量元素的指針。

v.end()指向存儲器指向向量末尾的一個元素。 C++允許您存儲該值(由於one-past-the-array-rule)並將其與矢量中的其他指針進行比較。這就是爲什麼您可以在您的for循環中將其用作停止點。

你在輸出中看到的實質上是一個cout風格的字符串,它是指針地址。

C++不讓你尊重v.end()。這將是未定義的行爲。