迭代器返回 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.您可以阅读更多关于它的信息,即RandomAccessIterator,在 http://en.cppreference.com。

最新更新