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