清除 std::string 对象的首选方法是什么?

Which is the preferred way to clear a std::string object?

#include <string>

using namespace std::literals;

int main()
{
    auto str = std::string{};
    str.resize(1024);

    // #1
    str = {};

    // #2
    str = ""; 

    // #3
    str = ""s;

    // #4
    str.clear();
    
    // #5
    str.resize(0);
    str.shrink_to_fit();
}

清除 std::string 对象的首选方法是什么?为什么?

您问题的正确答案

Which is the preferred way to clear a std::string object?

(你在问之前就知道了)是#4,str.clear();,因为这个清除了字符串。

  • #1 正在初始化
  • #2 和#3 是作业
  • #4,答案,清除字符串
  • #5 调整字符串大小

如果您对其他见解感兴趣,可以将代码复制并粘贴到 Godbolt 并检查汇编器输出。

惯用的正确答案是#4,也许是#1

这取决于你想从代码中得到什么以及你最喜欢什么风格。

就所有意图和目的而言,#1#2 的行为相同 - 只需分配空数据而不更改 capacity()

#3 构造新字符串并立即将其移动分配给旧字符串。这一变化不仅size()而且capacity()。版本 #5 做同样的事情但不需要构造新的 std::string.

最后 #4 更改大小并可能更改容量,但这取决于实现。