如何使用什么数据结构实现std::vector
?我写的时候
void f(int n) {
std::vector<int> v(n);
...
}
向量v
是否已在堆栈上分配?
答案 0 :(得分:6)
vector
对象将在堆栈上分配,并在内部包含指向堆上元素的开始的指针>
堆上的元素使vector
类能够按需增长和缩小。
在堆栈上使用vector
时,对象可以在超出范围时被破坏。
对于您的[]
问题,vector
类重载 []
运算符。我会在内部说,当你array[1]
时,基本做这样的事情:
return *(_Myfirst+ (n * elementSize))
vector
使用_Myfirst
跟踪其内部堆的开头。
当您的vector
开始填满时,它将为您分配更多内存。通常的做法是双倍每次所需的内存量。
注意 vector
继承自_Vector_val
,其中包含以下成员:
pointer _Myfirst; // pointer to beginning of array
pointer _Mylast; // pointer to current end of sequence
pointer _Myend; // pointer to end of array
_Alty _Alval; // allocator object for values
答案 1 :(得分:5)
您的v
分配在自动记忆中。 (通常称为堆栈,是)
未指定实现细节,但最常见的是使用动态数组实现,如果您尝试添加的元素数量超过以前的分配可以容纳的数量,则会调整其大小。
标准仅指定接口(它应该具有哪些方法)和执行时间边界。
由于vector
是模板,因此可以看到实现,因此找到您的<vector>
文件并开始检查。
答案 2 :(得分:2)
void f(int n) {
std::vector<int> v(n);
...
}
上面的矢量具有自动存储持续时间并在堆栈上分配。但是,向量管理的数据数组是在堆上分配的。
向量的内部是特定于实现的,但是典型的实现将包含3个指针;一个跟踪数组的开始,向量的大小和向量的容量。