在C ++中,向量函数push_back会增加空数组的大小吗?

时间:2011-10-15 00:37:27

标签: c++ vector push-back

快速提问。假设我声明了一个大小为20的向量。然后我想使用push_back为它添加一些整数。

vector<int> myVector(20);
myVector.push_back(5);
myVector.push_back(14);

我的载体的容量现在是22,还是20? 5和14分别加入指数[19]和[20]?或者他们是[0]和[1]?

6 个答案:

答案 0 :(得分:12)

在这些陈述之后,其能力是实施定义的。 (请注意,它的大小不同。)


vector<int> myVector(20);

这会创建一个充满20个0的向量。它的大小正好是二十,其容量至少为二十。它是否完全是二十是实现定义的;它可能有更多(实际上可能没有)。

myVector.push_back(5);

在此之后,数组的第21个元素为5,并且容量再次由实现定义。 (如果之前的容量正好是二十,那么它现在以未指定的方式增加。)

myVector.push_back(14);

同样,现在数组的第二十二个元素是14,容量是实现定义的。


如果你想保留空间而不是插入元素,你可以这样做:

vector<int> myVector;
myVector.reserve(20); // capacity is at least twenty, guaranteed not
                      // to reallocate until after twenty elements are pushed

myVector.push_back(5); // at index zero, capacity at least twenty.
myVector.push_back(14); // at index one, capacity at least twenty.

答案 1 :(得分:3)

  • size是向量容器中的元素数。
  • capacity是分配的存储空间的大小
  • push_back有效地将向量大小增加1,如果向量大小等于调用之前的向量容量,则会导致内部分配存储的重新分配。

更多信息:http://www.cplusplus.com/reference/stl/vector/

答案 2 :(得分:1)

push_back会增加std::vector的大小,并将新元素放在vector的后面(其他容器也有push_front方法来执行相同的操作在前面也是。)

但是,vector的大小和容量之间存在差异。 尺寸是指现在vector实际上有多少件商品; 容量是指vector在不重新分配内存的情况下可以容纳的项目总数。如果您知道要添加多个元素并且不希望增加reserve()零碎的内容,则可以vector内存。

答案 3 :(得分:1)

由于向量不为空但大小为20(包含20个元素)而push有2个元素到back,它现在包含22个元素。但新元素并未放在指数19和20,而是20和21。

如果你真的只想为向量保留足够的内存以容纳20个元素(实际上不包含任何元素),为了防止代价高昂的重新分配,那么你应该调用

std::vector<int> myVector;
myVector.reserve(20);

在这种情况下,向量仍为空,但它有足够的内存来添加至少20个元素(例如,使用push_back),而无需重新分配其内部存储。在这种情况下,向量仅包含push ed _back

的2个元素

答案 4 :(得分:1)

好吧,vector有成员函数push_back。其他序列如dequepush_front

  

0,1,2,......,最后

     

添加后:

     

0,1,2,.....,最后,加,......

你可能还记得:

capacity() returns the number of elements in the vector sufficient,
without allocating additional memory.
This number can be greater or equal to size.

也就是说,您无法在前面或中间添加,因为vector专门用于按索引快速访问元素。如果您想要正面和背面添加,可以使用与deque类似的vector。如果您想要添加到正面,背面和任何地方,可以使用list。请注意,list不提供dequevector等索引。

但是,假设向量的容量大于实际大小。向其中添加元素时,不需要分配额外的内存。只有当容量等于大小时才会这样做。在许多编译器上,新容量将是旧容量的两倍。分配后,它会复制新位置中的所有元素。然而,这种行为在记忆方面可能很昂贵。

答案 5 :(得分:1)

push_back会将向量的容量增加到至少为向量的新大小,但可能(即可能)稍大一些。

由于push_back需要在O(1)摊销时间内运行,因此每次重新分配将是旧容量的某个倍数。在典型的实现中,倍数是2。

但未指定确切的容量增加。如果您需要精确控制容量,请使用reserve

...

重新阅读你的问题,我不确定你理解矢量大小和容量之间的区别。大小是元素的数量。容量是向量在不执行重新分配的情况下可以保留的元素数。也就是说,在重新分配之前,您可以push_back capacity() - size()元素。

在您的示例中,5和14将分别出现在myVector [20]和myVector [21]上。