繁体   English   中英

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

[英]Why may vector.begin() not equal to &vector[0]?

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

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

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

请参阅: Iterator概念

如果我们有一个T型向量

vector<T> v;

然后

v.begin()&v[0]类型不同

v.begin()具有类型vector<T>::iterator (如果向量是非const)或vector<T>::const_iterator (如果向量是const)。

&vector[0]类型为T *

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM