std :: vector of std :: vectors contiguity

pen*_*ope 18 c++ vector stdvector

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

很好的stackoverflow问题处理这个并引用标准:答案,答案.

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

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

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

Ern*_*ill 21

否.a的元素vector存储在动态分配的内存块中; 否则,能力vector无法增加.该vector对象只保存指向该块的指针.

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


Lih*_*ihO 6

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

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

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


Mar*_*low 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);
Run Code Online (Sandbox Code Playgroud)

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