快速提问。假设我声明了一个大小为20的向量。然后我想使用push_back为它添加一些整数。
vector<int> myVector(20);
myVector.push_back(5);
myVector.push_back(14);
我的载体的容量现在是22,还是20? 5和14分别加入指数[19]和[20]?或者他们是[0]和[1]?
答案 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,如果向量大小等于调用之前的向量容量,则会导致内部分配存储的重新分配。答案 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
。
答案 4 :(得分:1)
好吧,vector
有成员函数push_back
。其他序列如deque
有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
和vector
等索引。
但是,假设向量的容量大于实际大小。向其中添加元素时,不需要分配额外的内存。只有当容量等于大小时才会这样做。在许多编译器上,新容量将是旧容量的两倍。分配后,它会复制新位置中的所有元素。然而,这种行为在记忆方面可能很昂贵。
答案 5 :(得分:1)
push_back
会将向量的容量增加到至少为向量的新大小,但可能(即可能)稍大一些。
由于push_back
需要在O(1)摊销时间内运行,因此每次重新分配将是旧容量的某个倍数。在典型的实现中,倍数是2。
但未指定确切的容量增加。如果您需要精确控制容量,请使用reserve
。
...
重新阅读你的问题,我不确定你理解矢量大小和容量之间的区别。大小是元素的数量。容量是向量在不执行重新分配的情况下可以保留的元素数。也就是说,在重新分配之前,您可以push_back
capacity() - size()元素。
在您的示例中,5和14将分别出现在myVector [20]和myVector [21]上。