在c++中,vector函数push_back会增加空数组的大小吗?

In C++, will the vector function push_back increase the size of an empty array?

本文关键字:数组 增加 back c++ vector 函数 push      更新时间:2023-10-16

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

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

现在向量的容量是22,还是20?是否将5和14分别加到索引[19]和[20]?还是在[0]和[1]?

在这些语句之后,其容量是由实现定义的。(请注意这与它的大小不同)


vector<int> myVector(20);

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

myVector.push_back(5);

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

myVector.push_back(14);

同样,现在数组的第22个元素是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.
  • size为vector容器中的元素个数。
  • capacity是已分配的存储空间的大小
  • push_back有效地将矢量大小增加1,如果矢量大小等于调用前的矢量容量,则会导致内部分配的存储重新分配。

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

push_back增加了std::vector的大小,并将新元素放置在vector的后面(其他容器也有push_front方法在前面做同样的事情)。

然而,vector的大小和容量之间存在差异。size表示当前vector中实际有多少项;容量表示vector在不重新分配内存的情况下可以容纳的条目总数。

如果您知道您要添加几个元素并且不想逐渐增加vector,则可以使用reserve()内存。

由于vector 不是空的,但它的大小为20(包含20个元素),并且您将push中的2个元素添加到back中,它现在包含22个元素。但是新元素的位置不是下标19和20,而是20和21。

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

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

在这种情况下,vector仍然是空的,但是它有足够的内存来添加至少20个元素(例如使用push_back),而不需要重新分配其内部存储。在这种情况下,向量只包含两个元素push_back

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

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

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

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

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

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

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

之后添加:

0, 1, 2, ....., final, addition,…

你可能还记得:

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那样提供索引。

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