题
如果你有一个已调整大小的STL向量,是否可以安全地获取元素0的地址并假设其余的向量将在内存中跟随?
e.g。
vector<char> vc(100);
// do some stuff with vc
vc.resize(200);
char* p = &vc[0];
// do stuff with *p
解决方案
是的,这是一个有效的假设(*)。
从C ++ 03标准(23.2.4.1):
存储向量的元素 连续地,意思是如果v是a 矢量,其中T是一些 除了布尔之外的类型,然后它服从 身份<!> amp; v [n] == <!> amp; v [0] + n for 全0 <!> lt; = n <!> lt; v.size()。
(*)...但在向元素添加元素后,请注意重新分配的数组(使任何指针和迭代器无效)。
其他提示
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在他的一篇博客文章中谈到了这一变化,不要担心:矢量保证是连续的:
......邻接实际上是其中的一部分 矢量抽象。它<!>#8217;非常重要, 事实上,当它被发现时 C ++ 98标准没有<!>#8217; t 完全保证邻接, C ++ 03标准被修改为 明确添加保证。
存储始终是连续的,但它可能会随着向量的容量的变化而移动。
如果在容量更改操作之前在元素零(或任何元素)上有指针,引用或迭代器,则它将失效并且必须重新分配。
std::vector
保证项目存储在连续的数组中,因此是数组的首选替换,也可用于与平台相关的低级代码(如Win32 API调用)进行交互。要获得指向数组的指针,请使用:
&myVector.front();
是肯定的。
它应该一直是连续的