我不太明白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。