矢量调整大小是如何实现的?

时间:2011-01-18 17:46:49

标签: c++ pointers new-operator add

我试图找出一个矢量在已经“创建”一些之后如何添加更多的对象,我的意思是:

int *ptr;
ptr = new int;

使用它之后,你可以为该指针添加更多对象吗? (使它成为一个数组)
谢谢!

6 个答案:

答案 0 :(得分:7)

大多数实现都是从一个小数组开始,每当它达到其容量时,就会分配一个大小为double的新数组,并将旧元素复制到新数组中。

答案 1 :(得分:4)

与大多数STL容器一样,它使用外部分配器来实际分配内存。这是向量的第二个模板参数。

它使用placement-new将对象创建到内存中。

为了在内存不足时添加更多对象,它必须分配更大的数量。如果基础类型是POD,它只能realloc,但如果不是,则必须使用对象的operator=移动它们。

答案 2 :(得分:3)

你不能把它变成一个数组,你只能把它指向一个数组。

所以当你这样做时:

int *ptr;
ptr = new int;

你已将指针ptr指向新创建的整数。您可以删除它并创建数组,并将ptr指向该数组:

delete ptr;
ptr = new int[5];

答案 3 :(得分:0)

Vector可以调整大小,因为它是一个类。它将数据隐藏在对象中,您无法直接看到其内部结构。您只需使用其公共界面即可。它可以为您提供一个新的较大阵列的复制数据,而无需您看到它。

你不能用int *来做这件事,因为你这里没有类,没有地方可以隐藏用户的实际实现。

答案 4 :(得分:0)

1. Build an array.
2. copy *ptr into it.
3. swap ptrs.
4. delete the temp.

你去了,你现在已经“调整了”你的ptr。

答案 5 :(得分:0)

矢量跟踪两位信息。

  1. 它的大小,即它当前持有的元素数量。
  2. 它的容量,或在耗尽内存之前它实际可以包含多少元素。
  3. 如果添加元素不会导致它超过其容量,那么就没有问题。它只是添加了新元素。

    如果超出容量,则计算新容量(通常为当前容量的1.5到2倍)并将所有元素复制到新阵列。这就是将项添加到向量后迭代器失效的原因。它们可能指的是旧的(现已释放的)数组。