[英]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.