【问题标题】:clang tidy complains about push_back into vector in a loopclang tidy 在循环中抱怨 push_back into vector
【发布时间】:2020-04-10 13:14:51
【问题描述】:

这是我的代码(工作正常),以及 IDE 的投诉: 我尝试使用vector<string> result(tmp.size()); 设置矢量大小,但之后,结果将在前面包含tmp.size() 数量的空字符串,我不想使用insert

有没有更好的解决方法?

【问题讨论】:

  • 这是关于优化的。每次达到向量分配的大小时,都需要重新分配它。如果在之前分配if并使用insert,它会运行得更快。或者您可以使用储备来避免重新分配
  • 我认为clang-tidy 消息是建议std::vector::reserve 而不是std::vector::resize
  • 请注意,如果decltype(*mph) 支持迭代器,那么您可以简单地执行std::vector<std::string> result(mph->begin(), mph->end());

标签: c++ vector push-back


【解决方案1】:

"pre-allocate" 这里并不是说将向量 resize 到最终大小,这是 vector<string> result(tmp.size()); 所做的,而是 reserve 最终大小的内存:

vector<string> result;
result.reserve(tmp.size());

正如 cmets 中提到的,这纯粹是为了性能优化。它不会改变代码的行为。 reserve 调用将导致分配足够大的内存块以容纳最终向量大小,但尚未构造任何元素,这仍将使用 push_back 完成。

这是一种性能优化,因为否则最终大小对于向量来说是未知的,因此它可能需要在循环期间多次重新分配内存块,这将(对于大尺寸渐近)增加循环所花费的时间一个常数因子,假设字符串的长度是有界的并且对mph-&gt;getValue() 的调用是O(1),否则效果将不那么显着。

【讨论】:

    猜你喜欢
    • 2021-08-19
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 2023-02-14
    • 1970-01-01
    相关资源
    最近更新 更多