假设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();
是。
它应该总是连续的