std :: vector of std :: vectors contiguity

时间:2012-06-05 13:14:52

标签: c++ vector stdvector

我知道std::vector<T>在旧的std::vector<bool>标准和新的C++03内部连续存储了数据(除非它是C++11)。

很好的stackoverflow问题可以解决这个问题并引用标准:answeranswer

嵌套向量std::vector <std::vector <T> >内的数据怎么样?怎么存储?

如果每个内部向量都需要连续存储它的数据,&v[n] == &v[0] + n for all 0 <= n < v.size()怎么可能是真的。

要略微区别这一点,是否可以“简单地”和顺序地(通过指针或类似方式)访问存储在这种嵌套结构中的所有元素,就像它可以为一维矢量?

4 个答案:

答案 0 :(得分:21)

没有。 vector的元素存储在动态分配的内存块中;否则,vector的容量无法增加。 vector对象只保存指向该块的指针。

元素按顺序存储的要求仅适用于元素本身,而不适用于这些元素的任何动态分配成员。

答案 1 :(得分:6)

回答你的最后一个问题:不。矢量矢量的元素不是连续存储的。

请考虑以下代码:

std::vector<std::vector<int> > vv;
.... fill in v[0], v[1], v[2], etc
std::vector <int> & v = vv[1];
v.push_back (23);

如果它们都是连续存储的,那么这将导致vv [2],vv [3]等中的每个元素移动。 这可能会如何工作,因为你只是影响一个向量'v'?

答案 2 :(得分:5)

std::vector< std::vector<T> >是一个对象向量,存储在连续的内存块中。事实上,这些对象也是向量,但这无关紧要。

虽然向量的元素存储在连续的内存块中,但元素所在的内存不是向量对象本身的一部分。

“是否可以”简单地“和顺序地(通过指针或类似物)访问存储在这种嵌套结构中的所有元素,就像对一维向量一样?”
要访问std::vector的元素,最好使用operator[]at()方法,而不是检索第一个元素的地址并使用指针算法。对于表示为向量向量的多维数组,我建议您使用operator[],它易于使用且易于阅读:myVector[i][j]。值得看vector::at vs. vector::operator[]:)

答案 3 :(得分:1)

  

是否可以“简单地”和顺序地(通过指针或类似物)访问存储在这种嵌套结构中的所有元素,就像对一维向量一样?

是,如果

  • 您只需要在向量矢量的末尾添加内容,

  • 您愿意用自定义数据结构替换vector构造的载体

然后你可以做的是将所有这些子向量连接成一个连续的缓冲区,另一个索引缓冲区用于通过顶级入口索引访问它。

有关此问题的更多讨论,请参阅my article here,以及“折叠矢量矢量”类实现示例..