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

时间:2010-04-13 09:17:39

标签: c++ stl vector

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

如果我稍后使用.clear(),那么只清除向量还是保存我之前定义的保留?

感谢。

5 个答案:

答案 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这样的技巧来实际摆脱缓冲区或使其变小。