29

我知道在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

4 回答 4

33

不。 a 的元素vector存储在动态分配的内存块中;否则,容量vector无法增加。该vector对象仅包含指向该块的指针。

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

于 2012-06-05T13:19:48.780 回答
8

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

考虑以下代码:

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'?

于 2012-06-05T13:21:10.717 回答
5

std::vector< std::vector<T> >是对象的向量,它们存储在连续的内存块中。不过,这些对象也是向量的事实是无关紧要的。

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

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

于 2012-06-05T13:20:56.793 回答
3

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

是的,如果

  • 您只需要在向量向量的末尾添加东西,并且

  • 您愿意用自定义数据结构替换向量构造的向量

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

有关此问题的更多讨论,请参阅我的文章,以及示例“折叠向量向量”类实现。

于 2013-11-26T14:00:55.233 回答