Iterator在vector :: begin()

时间:2018-04-27 16:22:13

标签: c++ vector iterator

我不太了解vector::begin()实际返回的内容。

Cplusplus.com告诉我vector::begin()返回向量的迭代器,这意味着对于vector<int> v;,它将给出0。

但是,当我在Visual Studio上进行调试时,监视表显示了v的第一个元素的值。此外,“类型”列表示它是std::_Vector_iterator

因此,实际上vector::begin()的输出是什么?

2 个答案:

答案 0 :(得分:5)

std::vector::begin返回一个迭代器。迭代器是指针的泛化 - 它是一种可用于访问容器元素的类型。每个容器都提供自己的迭代器类型。如何直接表示迭代器是一个实现细节,作为程序员,您应该只关心它们的接口(并保证它们对稳定性,有效性等有所了解。有关详细信息,请参阅suitable documentation。)

不同类型的迭代器支持不同的操作:一些只能递增(只能向前移动),一些也可以递减(向后移动);有些人需要一次移动一步,有些人可以一次移动多个元素;等

std::vector提供的迭代器是随机访问和连续,因此它们的功能几乎与指针完全相同。

对于空std::vector,调用begin()将为您提供与调用end()返回的完全相同的迭代器。 end()始终返回一个特殊的 past-the-end 迭代器。迭代器不能解除引用(它不指向任何元素),它只是作为容器结束的指示符。

答案 1 :(得分:1)

  

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