如果你有一个已调整大小的STL向量,是否可以安全地获取元素0的地址并假设其余的向量将在内存中跟随?
e.g。
vector<char> vc(100);
// do some stuff with vc
vc.resize(200);
char* p = &vc[0];
// do stuff with *p
答案 0 :(得分:72)
是的,这是一个有效的假设(*)。
从C ++ 03标准(23.2.4.1):
存储向量的元素 连续地,意思是如果v是a 矢量,其中T是一些 除了布尔之外的类型,然后它服从 身份&amp; v [n] ==&amp; v [0] + n for 全0&lt; = n&lt; v.size()。
(*)...但是在向元素添加元素之后要注意重新分配的数组(使任何指针和迭代器无效)。
答案 1 :(得分:27)
C ++ 03标准添加了措辞,以明确向量元素必须是连续的。
C ++ 03 23.2.4第1段包含以下C ++ 98标准文档中 not 的语言:
存储
vector
的元素 连续地,意味着如果v
是一个vector<T, Allocator>
所在的T
除bool
以外的某种类型,然后它 遵守所有&v[n] == &v[0] + n
的身份0 <= n < v.size()
。
Herb Sutter在他的一篇博文Cringe not: Vectors are guaranteed to be contiguous中谈到了这一变化:
......邻接实际上是其中的一部分 矢量抽象。这很重要, 事实上,当它被发现时 C ++ 98标准没有 完全保证邻接, C ++ 03标准被修改为 明确添加保证。
答案 2 :(得分:13)
存储始终是连续的,但它可能会随着向量的容量的变化而移动。
如果在容量更改操作之前在元素零(或任何元素)上有指针,引用或迭代器,则它将失效并且必须重新分配。
答案 3 :(得分:10)
答案 4 :(得分:4)
std::vector
保证项目存储在连续的数组中,因此是数组的首选替换,也可用于与平台相关的低级代码(如Win32 API调用)进行交互。要获得指向数组的指针,请使用:
&myVector.front();
答案 5 :(得分:2)
是肯定的。
它应该一直是连续的