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

e.g。

vector<char> vc(100);
// do some stuff with vc
vc.resize(200);
char* p = &vc[0];
// do stuff with *p
有帮助吗?

解决方案

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

从C ++ 03标准(23.2.4.1):

  

存储向量的元素   连续地,意思是如果v是a   矢量,其中T是一些   除了布尔之外的类型,然后它服从   身份<!> amp; v [n] == <!> amp; v [0] + n for   全0 <!> lt; = n <!> lt; v.size()。

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

其他提示

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

C ++ 03 23.2.4第1段包含以下C ++ 98标准文档中 not 的语言:

  

存储vector的元素   连续的,意思是如果v是一个   vector<T, Allocator>其中T是   除了bool之外的某种类型,然后它   服从所有&v[n] == &v[0] + n的身份0 <= n < v.size()

Herb Sutter在他的一篇博客文章中谈到了这一变化,不要担心:矢量保证是连续的

  

......邻接实际上是其中的一部分   矢量抽象。它<!>#8217;非常重要,   事实上,当它被发现时   C ++ 98标准没有<!>#8217; t   完全保证邻接,   C ++ 03标准被修改为   明确添加保证。

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

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

std::vector保证项目存储在连续的数组中,因此是数组的首选替换,也可用于与平台相关的低级代码(如Win32 API调用)进行交互。要获得指向数组的指针,请使用:

&myVector.front();

是肯定的。

它应该一直是连续的

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top