std::vector of std::vectors contiguity

std::vector of std::vectors contiguity

本文关键字:std contiguity vectors vector of      更新时间:2023-10-16

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

很好的堆栈溢出问题,处理这个问题并引用标准:回答,回答。

嵌套向量std::vector <std::vector <T> >中的数据呢?如何存储?

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

稍微不同一点,是否可以"简单"和顺序(通过指针或类似方式)访问存储在这种嵌套结构中的所有元素,就像对一维向量所做的那样?

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

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

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

请考虑以下代码:

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

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

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

"

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

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

是的,如果

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

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

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

有关此内容的更多讨论,以及示例"折叠的矢量矢量"类实现,请参阅我的文章。