std::vector的std::vectors连续性

32

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

有些很好的stackoverflow问题涉及到这个问题并引用了标准:答案1答案2

那么,关于嵌套向量 std::vector <std::vector <T> > 内部的数据是如何存储的呢?

如果每个内部向量都需要将其数据存储在连续的内存空间中,那么如何确保对于所有的 0 <= n < v.size(),都存在这样的条件 &v[n] == &v[0] + n

换句话说,是否可能像处理一维向量一样,通过指针或类似方式“简单”而顺序地访问此类嵌套结构中存储的所有元素?


“连续存储数据”和“内部存储数据”不是相同的概念。 - Mooing Duck
4个回答

34

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

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


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',那么这怎么可能会起作用呢?


我觉得它不能正常工作。另一方面,连续性要求在组合中让我感到困惑。 - penelope

5

std::vector< std::vector<T> >是一个对象的向量,这些对象存储在连续的内存块中。虽然这些对象也是向量,但这并不重要。

尽管向量的元素存储在连续的内存块中,但元素所在的内存不属于向量对象本身。

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


4

如果您只需要添加一些内容到您的向量中,而且您愿意使用自定义数据结构替换向量嵌套的结构,那么是可以通过指针或类似方式按顺序访问所有存储在这种嵌套结构中的元素的。

然后,您可以将所有子向量连接成一个单一连续缓冲区,并使用另一个索引缓冲区按顶层条目索引访问它。

请参见这里的我的文章以获取更多关于此的讨论和示例“折叠向量向量”类实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接