如果你有一个已经调整大小的STL向量,是否可以接受元素0的地址,并假设向量的其余部分将在内存中?假设STL矢量存储始终是连续的,是否安全?
例如
vector<char> vc(100);
// do some stuff with vc
vc.resize(200);
char* p = &vc[0];
// do stuff with *p
如果你有一个已经调整大小的STL向量,是否可以接受元素0的地址,并假设向量的其余部分将在内存中?假设STL矢量存储始终是连续的,是否安全?
例如
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是 向量,其中T是一些 类型比其它bool,那么它服从 身份& v [n] == & v [0] + n对于 全部0 < = n < v.size()。
(*)...但注意在向其添加元素后重新分配阵列(使任何指针和迭代器无效)。
是的。
应该总是支持连续
存储始终是连续的,但作为载体的容量发生变化,也可能会移动。
如果您在容量更改操作之前在元素零(或任何元素)上有指针,引用或迭代器,则它将失效并且必须重新分配。
std::vector
保证项目存储在一个连续的数组中,因此是数组的首选替代,也可用于与平台相关的低级代码(如Win32 API调用)进行接口。为了得到一个指向数组使用:
&myVector.front();
C++ 03标准添加了措辞以明确矢量元素必须是连续的。
C++ 03 23.2.4段1包含下列语言是不是C++ 98标准文件中:
一个
vector
的元素被存储 连续,这意味着如果v
是vector<T, Allocator>
其中T
是 某种类型比bool
等,那么它 服从所有0 <= n < v.size()
身份&v[n] == &v[0] + n
。
在他的博客条目之一这种变化香草萨特会谈,Cringe not: Vectors are guaranteed to be contiguous:
...连续性是在 矢量抽象的事实部分。其实很重要, ,当发现 那个C++ 98标准没有完全保证连续性时,修改了 C++ 03标准,明确加了保证。
+1如果您使用的是标准草案,或任何尚未批准和正式的,请说出来。在目前的标准中我找不到那样的东西。 – 2009-01-13 21:49:02