簡體   English   中英

迭代器在vector :: begin()中的返回

[英]Iterator return in vector::begin()

我不太了解vector::begin()實際返回了什么。

Cplusplus.com告訴我vector::begin()返回向量的迭代器,這意味着對於vector<int> v; ,它將得出0。

但是,當我在Visual Studio上調試時,監視表向我顯示了v的第一個元素的值。 此外,“類型”列表示它是std::_Vector_iterator

結果, vector::begin()的輸出實際上是什么?

std::vector::begin返回迭代器。 迭代器是指針的一般化-它是一種可用於訪問容器元素的類型。 每個容器都提供自己的迭代器類型。 如何精確地表示迭代器是實現細節,作為程序員,您應該只關心它們的接口(並保證它們具有穩定性,有效性等優點。有關更多信息,請參見適當的文檔 )。

不同類型的迭代器支持不同的操作:某些只能迭代(只能向前移動),有些也可以遞減(向后移動); 有些需要一次移動一步,有些可以一次移動多個元素。 等等

std::vector提供的迭代器是隨機訪問和重疊的,因此它們的功能幾乎與指針完全相同。

對於空的std::vector ,調用begin()將為您提供與調用end()返回的迭代器完全相同的迭代器。 end()始終返回一個特殊的, 過去的迭代器。 該迭代器不可解除引用(它不指向任何元素),而只是用作容器結束的指示符。

Cplusplus.com告訴我vector::begin()返回矢量的迭代器,

那是對的。

這意味着對於vector<int> v; ,它將得出0。

從先前的陳述中得出的結論是錯誤的。 std::vector<T>::begin()返回一個迭代器,如果它不為空,則該迭代器可用於訪問對象的第一個元素的內容。

鑒於

std::vector<int> v;
auto iter = v.begin();
int b = *iter; // Problem since the vector is empty.

std::vector<int> v{1, 3, 10};
auto iter = v.begin();
int b = *iter; // OK. b is the first element of the vector
int c = v[0];  // OK. c is also the first element of the vector.

也許您會感到困惑,是因為以上最后兩行的值相同。

然而...

std::vector<T>::iterator是模板std::vector的類型。 它是一個RandomAccessIterator 您可以在http://en.cppreference.com上了解有關它的更多信息,即RandomAccessIterator

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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