7

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

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

我的向量的容量现在是 22,还是仍然是 20?是否分别将 5 和 14 添加到索引 [19] 和 [20] 中?或者他们在[0]和[1]?

4

6 回答 6

16

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


vector<int> myVector(20);

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

myVector.push_back(5);

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

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.
于 2011-10-15T00:53:05.893 回答
3
  • size是向量容器中的元素数。
  • capacity是分配的存储空间的大小
  • push_back有效地将向量大小增加一,如果向量大小等于调用前的向量容量,这会导致内部分配的存储重新分配。

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

于 2011-10-15T00:46:25.767 回答
1

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

但是,a 的大小和容量之间存在差异vector大小是指现在实际有多少物品vector容量是指在vector不重新分配内存的情况下可以容纳的项目总数。reserve()如果您知道要添加几个元素并且不想逐渐增加,则可以记住vector

于 2011-10-15T00:43:16.903 回答
1

由于向量不是空的,但大小为 20(包含 20 个元素)并且您有push2 个元素到back,它现在包含 22 个元素。但是新元素不是放在索引 19 和 20,而是 20 和 21。

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

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

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

于 2011-10-15T00:43:19.113 回答
1

嗯,vector有会员功能push_back。其他序列如dequehave push_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它不提供像dequeand之类的索引vector

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

于 2011-10-15T00:49:58.353 回答
1

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

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

但具体的容量增加并没有具体说明。如果您需要精确控制容量,请使用reserve.

...

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

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

于 2011-10-15T00:52:07.937 回答