Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.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++ 调用std::vector::clear()会将std::vector::capacity()设置为零吗?_C++_Stl_Vector - Fatal编程技术网

C++ 调用std::vector::clear()会将std::vector::capacity()设置为零吗?

C++ 调用std::vector::clear()会将std::vector::capacity()设置为零吗?,c++,stl,vector,C++,Stl,Vector,如果我在一个向量上使用.reserve(items),该向量将分配足够的内存来猜测我需要的项数 如果我以后使用.clear(),这只是清除向量还是保存我以前定义的保留 谢谢。这不会影响基础缓冲区大小。这就是为什么您必须使用一些技巧,例如实际删除缓冲区或使其变小。它可能不会释放保留内存,尽管我认为标准中没有规定这种行为 编辑:好的,刚刚选中,标准只说明post条件是size()==0,尽管我还没有遇到一个向量实现不保留保留内存。不会。通过调用vector::capacity()试试看 这方面的进一

如果我在一个向量上使用.reserve(items),该向量将分配足够的内存来猜测我需要的项数

如果我以后使用.clear(),这只是清除向量还是保存我以前定义的保留


谢谢。

这不会影响基础缓冲区大小。这就是为什么您必须使用一些技巧,例如实际删除缓冲区或使其变小。

它可能不会释放保留内存,尽管我认为标准中没有规定这种行为


编辑:好的,刚刚选中,标准只说明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);