快速提问。假设我声明了一个大小为 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);
同样,现在数组的第二个元素是 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
是向量容器中的元素数。capacity
是分配的存储空间的大小push_back
有效地将向量大小增加一,如果向量大小等于调用前的向量容量,这会导致内部分配的存储重新分配。push_back
增加 的大小std::vector
并将新元素放在后面vector
(其他容器也有一种push_front
方法可以在前面做同样的事情)。
但是,a 的大小和容量之间存在差异vector
。大小是指现在实际有多少物品vector
;容量是指在vector
不重新分配内存的情况下可以容纳的项目总数。reserve()
如果您知道要添加几个元素并且不想逐渐增加,则可以记住vector
。
由于向量不是空的,但大小为 20(包含 20 个元素)并且您有push
2 个元素到back
,它现在包含 22 个元素。但是新元素不是放在索引 19 和 20,而是 20 和 21。
如果您真的只想为向量保留足够的内存以容纳 20 个元素(实际上不包含任何元素),以防止代价高昂的重新分配,那么您应该调用
std::vector<int> myVector;
myVector.reserve(20);
在这种情况下,向量仍然是空的,但它有足够的内存来添加至少 20 个元素(push_back
例如使用 ),而无需重新分配其内部存储空间。在这种情况下,向量仅包含您push
ed的 2 个元素_back
。
嗯,vector
有会员功能push_back
。其他序列如deque
have 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
它不提供像deque
and之类的索引vector
。
但是,假定向量的容量大于其实际大小。当您向其中添加元素时,它不需要分配额外的内存。仅当容量等于大小时才会这样做。在许多编译器上,新容量将是旧容量的两倍。分配后,它会复制新位置中的所有元素。然而,这种行为在内存方面可能是昂贵的。
push_back
将向量的容量至少增加到向量的新大小,但可能(即可能)更大一些。
因为push_back
需要在 O(1) 摊销时间内运行,所以每次重新分配都将是旧容量的某个倍数。在一个典型的实现中,倍数是 2。
但具体的容量增加并没有具体说明。如果您需要精确控制容量,请使用reserve
.
...
重新阅读您的问题,我不确定您是否理解向量大小和容量之间的区别。大小是元素的数量。容量是向量在不执行重新分配的情况下可以容纳的元素数量。也就是说,您可以push_back
在重新分配发生之前使用 capacity()-size() 元素。
在您的示例中,5 和 14 将分别出现在 myVector[20] 和 myVector[21] 中。