标准::矢量内部

std::vector internals

本文关键字:内部 标准      更新时间:2023-10-16

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

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

向量是否v堆栈上分配?

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

您的v自动内存中分配。(俗称堆栈,是的)

未指定实现详细信息,但最常见的是使用动态数组实现,如果您尝试添加的元素多于先前分配可以容纳的元素,则会调整该数组的大小。

该标准仅指定接口(它应该具有哪些方法)和执行时间边界。

由于vector是模板,因此实现是可见的,因此请找到<vector>文件并开始检查。

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

上面的向量具有自动存储持续时间,并在堆栈上分配。但是,向量管理的数据数组是在堆上分配的。

向量

的内部是特定于实现的,但典型的实现将包含 3 个指针;每个指针用于跟踪数组的开始、向量的大小和向量的容量。