清除 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
更改大小并可能更改容量,但这取决于实现。
#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
更改大小并可能更改容量,但这取决于实现。