我不太了解vector::begin()
实际返回的内容。
Cplusplus.com告诉我vector::begin()
返回向量的迭代器,这意味着对于vector<int> v;
,它将给出0。
但是,当我在Visual Studio上进行调试时,监视表显示了v
的第一个元素的值。此外,“类型”列表示它是std::_Vector_iterator
。
因此,实际上vector::begin()
的输出是什么?
答案 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
。