std :: vector internals

时间:2012-08-09 23:05:13

标签: c++ gcc c++11

如何使用什么数据结构实现std::vector?我写的时候

void f(int n) {
  std::vector<int> v(n);
  ...
}

向量v是否已在堆栈上分配?

3 个答案:

答案 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个指针;一个跟踪数组的开始,向量的大小和向量的容量。