我理解为Set size of vector of vectors at run time 描述,可以将向量的向量声明为
vector<vector<int> > ref;
然后通过
调整第一级的大小ref.resize(i);
并在第二级推送元素:
ref[i].push_back(23);
但是矢量矢量如何在内存中对齐?
对于简单的向量,它是一个容器并连续对齐其元素,如array
;但是在矢量矢量的情况下,我看不到图片。
由于每个内部向量的大小(向量向量中的向量)大小可能会发生变化,因此向量的外向量(向量 in vector的 vector )连续对齐内部向量?外向量是否为每个内向量研究了记忆空间?如果一个向量超调会怎么样?
答案 0 :(得分:20)
vector<int>
中存储的ref
结构的大小是不变的。通用实现将此作为三个指针,或32位体系结构上的大约12个字节,或闪亮的新64位体系结构上的24个字节。
所以ref
大致管理ref.capacity()* 12个字节的连续存储。
ref中的每个元素/ vector<int>
管理自己的整数,而不依赖于ref
元素管理的元素。为了简单起见,在ref.size() == ref.capacity()
下面的艺术渲染中。
所以你的
ref.resize(i);
仅影响顶行。你的
ref[i].push_back(23);
仅影响第i列。
答案 1 :(得分:2)
vector<vector <int>> m;
push_back
和resizing
执行动态分配。 vector< vector<int> >
中的每个内部向量不必具有相同的大小。因此,内部向量(不是它们的元素)不是连续存储的。这意味着,m[i]
的第一个元素未存储在{{1}的 last 元素旁边的地址 中}。矢量的外部矢量(矢量矢量中的矢量)是否连续对齐内部矢量?
没有。见第2点
外部向量是否为每个内部向量研究了记忆空间?
没有。见第1点。你需要m[i-1]
或resize
进入内部向量。
矢量向量如何在内存中对齐?
push_back
消耗这么多内存
vector<T> vec;
其中,
sizeof(vector<T>) + (vec.size() ∗ sizeof(T))
= 12个字节
和sizeof(vector<T>)
为T
。
因此,3乘4 vector<int>
所消耗的内存将是。
vector<vector<int>>
如果一个向量超调会怎么样?
vector.resize function corrupting memory when size is too large
答案 2 :(得分:1)
vector<vector<int>>
在内存中看起来像这样:
+-+-+-+
|b|e|c| vector<vector<int>
+-+-+-+
| | |
| | +-------------------+
| | |
| +---------------+ |
| | |
V V V
+-+-+-+-+-+-+-+-+-+
|b|e|c|b|e|c|b|e|c| 3x vector<int>
+-+-+-+-+-+-+-+-+-+
| | | | | | | | |
| | | | | | | | +-------------+
| | | | | | | | |
| | | | | | | +-------+ |
| | | | | | | | |
| | | | | | V V V
| | | | | |+-+-+-+-+-+
| | | | | ||i|i|i|i|i| 5x int
| | | | | |+-+-+-+-+-+
| | | | | |
| | | | +-+---+
| | | | |
| | | V V
| | |+-+-+-+-+
| | ||i|i|i|i| 4x int
| | |+-+-+-+-+
| | |
| +-+-----------+
| |
V V
+-+-+-+-+-+-+-+-+
|i|i|i|i|i|i|i|i| 8x int
+-+-+-+-+-+-+-+-+
此处b
表示begin()
poiner,e
表示end()
指针,c
表示capacity()
指针。
您可以看到行在内存中不连续,就像您对矩阵结构所期望的那样。每个向量(内部和外部向量)都会处理它自己的内存分配。外部向量不关心它的元素在做什么。