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