Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 清除向量是否会影响其容量?_C++_Vector_Size_Std_Capacity - Fatal编程技术网

C++ 清除向量是否会影响其容量?

C++ 清除向量是否会影响其容量?,c++,vector,size,std,capacity,C++,Vector,Size,Std,Capacity,我实例化了一个std::vector foo(1000) foo.size()现在是1000,而foo.capacity()现在也是1000 如果我用foo.clear()清除向量,那么size()现在是0,但是容量()是多少?标准对此有什么规定吗?没有,清除不会影响它的容量(),即使你清除了,它也会保持不变。如果要缩小向量以进行拟合,可以在调用“清除”后使用以下技巧: foo.swap(向量(foo)) 该标准没有说明clear对容量的影响不,它没有。向量的容量永远不会减少。这不是标准要求的,

我实例化了一个
std::vector foo(1000)

foo.size()
现在是1000,而
foo.capacity()
现在也是1000


如果我用
foo.clear()
清除向量,那么
size()
现在是0,但是
容量()是多少?标准对此有什么规定吗?

没有,清除不会影响它的容量(),即使你清除了,它也会保持不变。如果要缩小向量以进行拟合,可以在调用“清除”后使用以下技巧:
foo.swap(向量(foo))

该标准没有说明
clear
容量的影响
不,它没有。向量的容量永远不会减少。这不是标准要求的,但在VC++和g++的标准库实现中都是如此。为了将容量设置为刚好适合大小,请使用著名的交换技巧

vector<T>().swap(foo);

要清除向量并消耗尽可能少的容量,请使用交换技巧:

std::vector<T>().swap(foo);
std::vector().swap(foo);

这将创建一个空向量,将其内部与
foo
交换,然后销毁临时向量,除去曾经属于
foo
的元素,并将
foo
保留为新创建的元素。

可能会这样。标准没有规定,所以你不应该依赖它。虽然大多数实现都是这样做的。@BjörnPollex如果标准没有说容量会减少,那么它就不能。@curiousguy:事实上,如果标准没有明确说明会发生什么,那么它可以按照实现想要的任何方式发生。@ZanLynx不。标准不允许这样的事情。如果标准不允许它,那么它就不会发生。在0x中,
vector
shorn\u to\u fit
,但标准说明它是无约束力的,我认为这意味着不需要实现它。你能给出一个c++03的引用吗?它表示,
erase(.begin(),.end())
在擦除点之后使所有迭代器和引用无效。这似乎并没有说明容量。@Johannes:我说标准中没有提到它!我说在大多数实现中都是如此!你说向量的容量永远不会减少(即使没有显式地调用“reserve”)。我找不到这样的规范。@Armen:是的,您不能将右值传递给swap,但您可以对右值调用swap,因此我交换了参数:)我使用
std::swap(foo,ItemContainer())
,并在可能的情况下将
typedef std::vector ItemContainer
放在其他地方。将临时对象作为参数传递比将其作为调用对象和左值传递更容易识别(IMHO)。你的方式是100%好。可能重复的
std::vector<T>().swap(foo);