【问题标题】:Will a call to std::vector::clear() set std::vector::capacity() to zero?调用 std::vector::clear() 会将 std::vector::capacity() 设置为零吗?
【发布时间】:2010-04-13 09:17:39
【问题描述】:

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

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

谢谢。

【问题讨论】:

标签: c++ stl vector


【解决方案1】:

指定std::vector<T>::clear()影响大小。它可能不会影响容量。要重置容量,请使用 swap 技巧

    std::vector<int> v1;

    // somehow increase capacity

    std::vector<int>().swap(v1);

注意:由于这个旧答案仍在获得支持(因此人们阅读它),我觉得有必要添加 C++ 11 增加了std::vector&lt;...&gt;::shrink_to_fit(),请求向量移除未使用的容量。

【讨论】:

  • 众所周知,您甚至可以在这里找到它:en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Clear-and-minimize 不是类似的“缩小以适应”,用于将向量的容量减少到实际元素数量(当有一些元素时) .
  • 可能影响容量。标准要求避免更改容量或重新分配。所以无论哪种方式都不能保证。
  • @underscore_d:谢谢。我改变了答案来解决这个问题。
【解决方案2】:

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

编辑:好的,刚刚检查过,标准只说后置条件是size() == 0,尽管我没有遇到不坚持的vector 实现保留的内存。

【讨论】:

  • +1 用于检查标准和“可能”(我通常希望内存保留)。在我使用的嵌入式系统上,我实际上遇到了一个可以清除释放内存的实现。
【解决方案3】:

不,不会的。拨打vector::capacity()试试看。

shrink_to_fit 的出现进一步证明了这一点。该标准的工作草案提到:

备注: shrink_to_fit 是一个非约束性请求 将容量()减少到大小()。 [ 注意:请求不绑定到 允许纬度 特定于实现的优化。 ——尾注]

【讨论】:

    【解决方案4】:

    不,它不会将 reserve() 设置为 0。调用 clear() 调用每个元素的析构函数并将它们从向量中删除,使容器的大小为 0,但容量保持不变。

    【讨论】:

    • 如果您的实现保持不变。标准不要求这样做,因此容量和分配可以在clear() 上更改。
    【解决方案5】:

    它不会影响底层缓冲区的大小。这就是为什么你必须使用像this 这样的技巧来真正摆脱缓冲区或使其更小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      • 2016-03-31
      • 1970-01-01
      • 2012-03-07
      相关资源
      最近更新 更多