为什么vector.begin()不等于& vector [0]?

时间:2014-07-17 16:18:16

标签: c++ vector stl

此处http://www.parashift.com/c++-faq/vector-is-contiguous.html表示vector.begin()可能不等于&vector[0]。为什么以这种方式定义它。什么阻止vector.begin()等于&vector[0]

3 个答案:

答案 0 :(得分:5)

vector的迭代器可以定义为某个类。当成员函数返回迭代器时,它不必是指向数组的第一个元素的原始指针。它可以是该类的一个对象。只需要迭代器定义operator *,它将返回对向量的第一个元素的引用,前提是向量不为空。

答案 1 :(得分:3)

vector.begin()返回的迭代器在技术上只允许您通过取消引用运算符获取值。那个解引用操作符可以在里面做各种各样的事情。大多数实现只是存储指向T的指针 - 或者指向T的指针 - 然后在它们的解引用运算符中简单地取消引用它,但那不是迭代器概念的要求。

请参阅:Iterator concept

答案 2 :(得分:2)

如果我们有一个T型载体

vector<T> v;

然后

v.begin()&v[0]

的类型不同

v.begin()的类型为vector<T>::iterator(如果向量为非常量)或vector<T>::const_iterator(如果向量为常量)。

&vector[0]的类型为T *

现在在一些实现中,向量迭代器被实现为指向T的指针。 所以一些程序员假设向量迭代器与指向T的指针同义。 这不受标准的支持。在其他实现中,vector迭代器是一个类。

要形成一个指向向量中第N个元素的迭代器,表达式 应该使用(v.begin() + N)

要在向量中形成指向第N个元素的指针,表达式 应该使用&v[N]

无论供应商如何实现矢量迭代器,这些表达式都是有效的。 它们也适用于deque和string。