一个向量具有容量和大小。容量是已分配内存的元素数量。大小是实际在向量中的元素数量。当向量的大小为0时,它为空。因此,size()返回0,empty()返回true。这并不意味着此时向量的容量(这将取决于自创建以来对向量进行的插入和删除次数等因素)。capacity()会告诉您当前容量-即在必须重新分配其内部存储以容纳更多元素之前,向量可以容纳的元素数量。
因此,当您构造一个
vector
时,它具有特定的大小和特定的容量。默认构造的
vector
的大小为零,容量由实现定义。您可以自由地向
vector
中插入元素,而不必担心
vector
是否足够大 - 直到
max_size()
-
max_size()
是该系统上
vector
可以具有的最大容量/大小(通常足够大,无需担心)。每次将项插入
vector
时,如果它具有足够的容量,则不会向
vector
分配内存。但是,如果插入该元素会超过
vector
的容量,则
vector
的内存会在内部重新分配,以便它具有足够的容量来容纳新元素以及实现定义的一些新元素(通常情况下,
vector
的容量可能会增加一倍),并将该元素插入向量中。这发生在
常数摊销时间内,因此通常不需要担心它会成为性能问题。
如果您发现自己经常向
vector
添加元素,导致多次重新分配内存,这可能会影响性能,那么可以调用
reserve()
将容量设置为至少给定值。通常情况下,当您非常确定
vector
可能包含多少个元素时,才会这样做。但是,除非您知道这会影响性能,否则这可能是一个不好的主意。这只会使您的代码更加复杂。而
恒定摊销时间通常足以避免性能问题。
您还可以像您提到的那样构造具有给定数量默认构造元素的
vector
,但是,除非您真的需要这些元素,否则这将是一个不好的主意。
vector
应该使您无需担心在插入元素时重新分配容器(就像您必须使用数组一样),并且为了分配内存而在其中默认构造元素将会破坏这一点。如果您确实想要这样做,请使用
reserve()
。但同样,除非您确定这将改善性能,否则不要费心使用
reserve()
。正如另一个答案中指出的那样,如果您根据用户输入向
vector
插入元素,则很可能I/O的时间成本远远超过当它耗尽容量时重新分配
vector
内存的时间成本。
与容量相关的函数:
capacity() // Returns the number of elements that the vector can hold
reserve() // Sets the minimum capacity of the vector.
与大小相关的函数:
clear() // Removes all elements from the vector.
empty() // Returns true if the vector has no elements.
resize() // Changes the size of the vector.
size() // Returns the number of items in the vector.