56

如果您有一个已调整大小的 STL 向量,那么获取元素 0 的地址并假设该向量的其余部分将跟随在内存中是否安全?

例如

vector<char> vc(100);
// do some stuff with vc
vc.resize(200);
char* p = &vc[0];
// do stuff with *p
4

6 回答 6

72

是的,这是一个有效的假设 (*)。

来自 C++03 标准(23.2.4.1):

向量的元素是连续存储的,这意味着如果 v 是一个向量,其中 T 是除 bool 之外的某种类型,那么对于所有 0 <= n < v,它都遵循恒等式 &v[n] == &v[0] + n 。尺寸()​​。

(*) ...但要注意在向其添加元素后重新分配的数组(使任何指针和迭代器无效)。

于 2008-10-29T17:50:55.967 回答
27

C++03 标准增加了措辞,明确向量元素必须是连续的。

C++03 23.2.4 第 1 段包含以下C++98 标准文档中没有的语言:

a 的元素vector是连续存储的,这意味着如果va 是 a 以外vector<T, Allocator>T某种类型bool,则它服从&v[n] == &v[0] + nall的标识0 <= n < v.size()

Herb Sutter 在他的一篇博客文章中谈到了这一变化,不畏惧:向量保证是连续的

...连续性实际上是矢量抽象的一部分。事实上,它是如此重要,以至于当发现 C++98 标准并没有完全保证连续性时,C++03 标准被修改为明确添加了保证。

于 2008-10-29T18:34:33.460 回答
14

存储始终是连续的,但它可能会随着向量容量的变化而移动。

如果在容量更改操作之前,您在元素零(或任何元素)上有指针、引用或迭代器,则它无效,必须重新分配。

于 2008-10-29T17:49:44.453 回答
10

是的,它是连续的

于 2008-10-29T17:47:51.493 回答
4

std::vector保证项目存储在连续数组中,因此是数组的首选替代品,也可用于与平台相关的低级代码(如 Win32 API 调用)进行交互。要获取指向数组的指针,请使用:

&myVector.front();
于 2008-10-29T17:50:37.620 回答
2

是的。

它应该始终是连续的

于 2008-10-29T17:46:03.870 回答