假设STLvector存储总是连续的,是否安全?

如果你有一个已经resize的STL向量,可以安全地取出元素0的地址,并假设向量的其余部分将在内存中?

例如

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是一个向量,其中T是除bool之外的某种types,那么对于所有的0 <= n <v,它遵从标识&v [n] ==&v [0] + n 。尺寸()​​。

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

C ++ 03标准添加了措辞,以明确vector元素必须是连续的。

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

一个vector的元素是连续存储的,这意味着如果v是一个vector<T, Allocator> ,其中T是除bool之外的某种types,那么它遵从所有0 <= n < v.size()的身份&v[n] == &v[0] + n 0 <= n < v.size()

Herb Sutter在他的一个博客文章中谈到了这个变化, Cringe not:vector保证是连续的 :

连续性实际上是vector抽象的一部分。 事实上,如果发现C ++ 98标准没有完全保证连续性,C ++ 03标准就被修改为明确加上保证,这一点非常重要。

存储总是连续的,但是可能会随着向量容量的改变而移动。

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

是的,它是连续的

std::vector保证这些项存储在一个连续的数组中,因此是数组的首选替代,也可以用来与平台相关的底层代码(如Win32 API调用)进行接口。 要获取指向数组的指针,请使用:

 &myVector.front(); 

是。

它应该总是连续的