如果我在向量上使用.reserve(items),向量将分配足够的内存来猜测我需要的项目数。
如果我稍后使用.clear(),那么只清除向量还是保存我之前定义的保留?
感谢。
答案 0 :(得分:46)
指定std::vector<T>::clear()
影响大小。它可能不会影响容量。要重置容量,请使用交换技巧:
std::vector<int> v1;
// somehow increase capacity
std::vector<int>().swap(v1);
注意: 由于这个旧答案仍然是upvotes(因此人们阅读它),我觉得需要添加 C ++ 11 添加了std::vector<...>::shrink_to_fit()
,请求向量删除未使用的容量。
答案 1 :(得分:11)
虽然我认为标准中没有指定行为,但它可能不会释放保留的内存。
编辑:好的,刚检查过,标准只说后置条件是size() == 0
,虽然我没有遇到vector
实施但没有抓住保留的记忆。
答案 2 :(得分:8)
不,不会。通过致电vector::capacity()
来试试。
这方面的进一步证据是shrink_to_fit
的出现。标准的工作草案提到:
说明: shrink_to_fit是一个非绑定请求 减少容量()到size()。 [ 注意:请求不绑定 允许纬度 特定于实现的优化。 - 后注]
答案 3 :(得分:1)
不,它不会将reserve()设置为0.调用clear()会调用每个元素的析构函数并将其从向量中移除,使容器的大小为0,但容量保持不变。
答案 4 :(得分:0)
它不会影响底层缓冲区大小。这就是为什么你必须使用像this这样的技巧来实际摆脱缓冲区或使其变小。