std :: vector internals

Car*_*s00 3 c++ gcc c++11

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

void f(int n) {
  std::vector<int> v(n);
  ...
}
Run Code Online (Sandbox Code Playgroud)

v堆栈上是否分配了向量?

Aes*_*ete 6

vector对象将在堆栈上分配,并在内部包含指向堆上元素开头的指针.

堆上的元素使vector类具有按需增长和缩小的能力.

堆叠vector堆叠上时,对象具有在超出范围时被破坏的好处.

在问候你的[]问题,vector重载[]操作.我会在内部说它当你做的时候基本上做这样的事情array[1]:

return *(_Myfirst+ (n * elementSize))
Run Code Online (Sandbox Code Playgroud)

在哪里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
Run Code Online (Sandbox Code Playgroud)


Luc*_*ore 5

v的分配在自动内存中.(通常称为堆栈,是)

未指定实现细节,但最常见的是使用动态数组实现,如果您尝试添加的元素数量超过以前的分配可以容纳的数量,则会调整其大小.

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

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

  • @LuchianGrigore:不,永远不会.在真实世界的库C++中几乎没有使用array-`new`.这是所有分配器和元素安置 - "新".(想想大小和容量之间的区别; array-`new`没有任何意义.) (4认同)
  • 在某些实现中,默认的`operator new`调用`malloc`.但不总是.另外,`operator new(std :: size_t)`永远不会返回空指针,可以用程序替换. (2认同)
  • @LuchianGrigore:`new T []`要求容量始终等于大小.而`new char []`with`new(ptr)T()`并不强制大小等于容量. (2认同)
  • @LuchianGrigore:`new T [N]`分配一个数组,它有N个实时`T`对象,都是默认构造的,释放它会破坏所有N.这意味着(1)你必须总是使用默认的构造函数,并且(2)你必须总是在数组中有N个活动对象,不多也不少,这意味着你必须为每个插入和每次删除调整大小,并且大小总是等于容量.放置new可以随意将对象放置或擦除到`char`缓冲区. (2认同)