std ::向量元素是否保证是连续的?

我的问题很简单:std :: vector元素保证是连续的吗? 换句话说,我可以使用std :: vector的第一个元素作为C数组吗?

如果我的记忆为我服务,C ++标准没有做出这样的保证。 然而,std :: vector的要求是这样的,如果元素不是连续的,要满足它们几乎是不可能的。

有人可以澄清这一点吗?

例:

std::vector<int> values; // ... fill up values if( !values.empty() ) { int *array = &values[0]; for( int i = 0; i < values.size(); ++i ) { int v = array[i]; // do something with 'v' } } 

这从C ++ 98标准正确的错过了,但后来作为TR的一部分被添加了。 即将出台的C ++ 0x标准当然会包含这个要求。

从n2798(C ++ 0x草稿):

23.2.6类模板vector[vector]

1vector是一个支持随机访问迭代器的序列容器。 此外,它支持(分期付款)恒定时间插入和擦除操作结束; 插入和擦除线性时间中间。 存储pipe理是自动处理的,尽pipe提示可以提高效率。 一个向量的元素是连续存储的,这意味着如果v是一个向量,其中T是除bool之外的某种types,那么对于所有的0 <= n <v,它遵从标识&v [n] ==&v [0] + n 。尺寸()​​。

正如其他答案指出的,vector的内容保证是连续的(除了bool的怪异)。

我想添加的注释是,如果您在向量上执行插入或删除操作(可能导致向量重新分配其内存),则会导致您保存的所有指针和迭代器失效。

该标准实际上保证了一个vector在内存中是连续的,并且可以将&a[0]传递给需要数组的一个C函数。

这个规则的例外是vector<bool> ,每个bool只使用一个bit,虽然它有连续的内存,但不能用作bool* (这被广泛地认为是错误的优化和错误)。

顺便说一句,你为什么不使用迭代器? 这就是他们的目的。

正如其他人已经说过, vector内部使用一个连续的对象数组。 当任何非const成员函数被称为IIRC时,指向该数组的指针应被视为无效。

但是,有一个例外!

vector<bool>有一个专门的实现,旨在节省空间,使每个布尔只使用一个位。 底层数组不是像vector<T>会工作的vector<bool>的布尔和数组算术的连续数组。

(我想这也可能是vector的任何特化,因为我们总是可以实现一个新的,但是, std::vector<bool>是唯一的,没有工作。)

我发现这个线程,因为我有一个用例,使用连续内存的向量是一个优势。

我正在学习如何在OpenGL中使用顶点缓冲对象。 我创build了一个包装类来包含缓冲区逻辑,所以我需要做的就是传递一个浮点数组和一些configuration值来创build缓冲区。 我希望能够根据用户input从一个函数中生成一个缓冲区,所以在编译时不知道长度。 做这样的事情将是最简单的解决scheme:

 void generate(std::vector<float> v) { float f = generate_next_float(); v.push_back(f); } 

现在,我可以将vector的浮点值作为数组传递给OpenGL的缓冲区相关函数。 这也消除了sizeof确定数组长度的需要。

这比分配一个巨大的数组来存储浮动块要好得多,或者让自己的dynamic数组具有连续的存储空间。

是的,std :: vector的元素保证是连续的。

cplusplus.com:

向量容器被实现为dynamic数组; 就像常规数组一样,vector容器也将其元素存储在连续的存储位置,这意味着它们的元素不仅可以使用迭代器访问,还可以使用常规指向元素的偏移量来访问。