我知道std::vector<T>
在旧的std::vector<bool>
标准和新的C++03
内部连续存储了数据(除非它是C++11
)。
很好的stackoverflow问题可以解决这个问题并引用标准:answer,answer。
嵌套向量std::vector <std::vector <T> >
内的数据怎么样?怎么存储?
如果每个内部向量都需要连续存储它的数据,&v[n] == &v[0] + n for all 0 <= n < v.size()
怎么可能是真的。
要略微区别这一点,是否可以“简单地”和顺序地(通过指针或类似方式)访问存储在这种嵌套结构中的所有元素,就像它可以为一维矢量?
答案 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,以及“折叠矢量矢量”类实现示例..