为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
忽然笑 2019-09-02 17:01:24
如果你有一个已调整大小的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 。尺寸()。

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


查看完整回答
反对 回复 2019-09-02
?
翻翻过去那场雪

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标准被修改为明确添加保证。


查看完整回答
反对 回复 2019-09-02
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

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

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


查看完整回答
反对 回复 2019-09-02
  • 3 回答
  • 0 关注
  • 477 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信