当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《假设STL向量存储始终是连续的是否安全?》经验,为你挑选了4个好方法。

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

例如

vector vc(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

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



1> Eclipse..:

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

从C++ 03标准(23.2.4.1):

向量的元素是连续存储的,这意味着如果v是一个向量,其中T是某种类型而不是bool,那么它服从所有0 <= n

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


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

2> Michael Burr..:

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

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

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

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

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



3> Adam Holmber..:

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

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



4> Jasper Bekke..:

是的它是连续的

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有