C++ 调用std::vector::clear()会将std::vector::capacity()设置为零吗?
如果我在一个向量上使用.reserve(items),该向量将分配足够的内存来猜测我需要的项数 如果我以后使用.clear(),这只是清除向量还是保存我以前定义的保留C++ 调用std::vector::clear()会将std::vector::capacity()设置为零吗?,c++,stl,vector,C++,Stl,Vector,如果我在一个向量上使用.reserve(items),该向量将分配足够的内存来猜测我需要的项数 如果我以后使用.clear(),这只是清除向量还是保存我以前定义的保留 谢谢。这不会影响基础缓冲区大小。这就是为什么您必须使用一些技巧,例如实际删除缓冲区或使其变小。它可能不会释放保留内存,尽管我认为标准中没有规定这种行为 编辑:好的,刚刚选中,标准只说明post条件是size()==0,尽管我还没有遇到一个向量实现不保留保留内存。不会。通过调用vector::capacity()试试看 这方面的进一
谢谢。这不会影响基础缓冲区大小。这就是为什么您必须使用一些技巧,例如实际删除缓冲区或使其变小。它可能不会释放保留内存,尽管我认为标准中没有规定这种行为
编辑:好的,刚刚选中,标准只说明post条件是
size()==0
,尽管我还没有遇到一个向量
实现不保留保留内存。不会。通过调用vector::capacity()
试试看
这方面的进一步证据是出现了收缩到合适的。本标准的工作草案提到:
备注:
收缩到合适是一个不具约束力的请求
将容量()减小为大小()。[
注意:该请求对
容许
特定于实现的优化。
-[完注]
不,它不会将reserve()设置为0。调用clear()调用每个元素的析构函数并将其从向量中移除,使容器的大小为0,但容量保持不变。指定std::vector::clear()
影响大小。这可能不会影响容量。要重置容量,请使用交换技巧:
std::vector v1;
//以某种方式增加容量
std::vector().swap(v1);
注意:由于这个旧答案仍在获得选票(因此人们阅读了它),我觉得有必要补充一点,C++11添加了std::vector::shrink_to_fit()
,它要求向量删除未使用的容量 这是一个骗局,不是,这个问题甚至没有提到clear()
。唯一使用“clear”一词的地方是以“It't not clear to me if…”开头的注释,它可能是众所周知的重复,你甚至可以在这里找到它:不是类似的“收缩到适合”来将向量的容量减少到实际的元素数(当有一些元素时)。它可能会影响容量。本标准不要求避免改变容量或重新分配。所以这两种方法都不能保证。@underline\u-d:谢谢。我更改了答案以修复此问题。+1用于检查标准和“可能”(我通常希望内存保持不变)。在我使用过的嵌入式系统上,我实际上遇到过一个在clear.if上释放内存的实现。标准不要求这样做,因此允许在clear()
上更改容量和分配。
std::vector<int> v1;
// somehow increase capacity
std::vector<int>().swap(v1);