如果你有一个已调整大小的STL向量,是否可以安全地获取元素0的地址并假设其余的向量将跟随内存?
例如
vectorvc(100); // do some stuff with vc vc.resize(200); char* p = &vc[0]; // do stuff with *p
Eclipse.. 72
是的,这是一个有效的假设(*).
从C++ 03标准(23.2.4.1):
向量的元素是连续存储的,这意味着如果v是一个向量,其中T是某种类型而不是bool,那么它服从所有0 <= n
(*)...但是在向元素添加元素之后要注意重新分配的数组(使任何指针和迭代器无效).
是的,这是一个有效的假设(*).
从C++ 03标准(23.2.4.1):
向量的元素是连续存储的,这意味着如果v是一个向量,其中T是某种类型而不是bool,那么它服从所有0 <= n
(*)...但是在向元素添加元素之后要注意重新分配的数组(使任何指针和迭代器无效).
C++ 03标准添加了措辞,以明确向量元素必须是连续的.
C++ 03 23.2.4第1段包含以下语言,该语言不在 C++ 98标准文档中:
的元素
vector
被连续存储,也就是说如果v
是vector
其中T
一些类型比其他的bool
,那么它遵循的身份&v[n] == &v[0] + n
对所有0 <= n < v.size()
.
Herb Sutter在他的一篇博文中讨论了这一变化,Cringe not:矢量保证是连续的:
......邻接实际上是矢量抽象的一部分.事实上,当发现C++ 98标准不能完全保证连续性时,它是如此重要,C++ 03标准被修改为明确添加保证.
存储始终是连续的,但它可能会随着向量的容量的变化而移动.
如果在容量更改操作之前在元素零(或任何元素)上有指针,引用或迭代器,则它将失效并且必须重新分配.
是的它是连续的