假设STL向量存储始终是连续的是否安全?

时间:2008-10-29 17:44:13

标签: c++ stl vector

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

e.g。

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

6 个答案:

答案 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)

是肯定的。

它应该一直是连续的