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

Fer*_*cio 55 c++ stl vector

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

例如

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

Ecl*_*pse 72

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

从C++ 03标准(23.2.4.1):

向量的元素是连续存储的,这意味着如果v是一个向量,其中T是某种类型而不是bool,那么它服从所有0 <= n <v的身份&v [n] ==&v [0] + n .尺寸()​​.

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

  • 在C++ 0x草案中,它是23.2.5.1,在C++ 03中,它是23.2.4.1.措辞不符合C++ 98标准.我在看ISO/IEC 14882:2003(E) (5认同)

Mic*_*urr 27

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

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

的元素vector被连续存储,也就是说如果vvector<T, Allocator>其中T一些类型比其他的bool,那么它遵循的身份&v[n] == &v[0] + n对所有0 <= n < v.size().

Herb Sutter在他的一篇博文中讨论了这一变化,Cringe not:矢量保证是连续的:

......邻接实际上是矢量抽象的一部分.事实上,当发现C++ 98标准不能完全保证连续性时,它是如此重要,C++ 03标准被修改为明确添加保证.


Ada*_*erg 13

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

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