【发布时间】:2018-12-14 10:32:16
【问题描述】:
如果我想将 char c 添加到字符串 s 的开头,以下是好的做法吗?
string s = "oo";
char c = 'f';
s = c + s;
在关于 SO 的问题“Prepend std::string”中,建议这样做的答案不如建议使用成员函数 .insert() 的最佳答案受欢迎。
除了效率还有其他原因吗(s = c + s效率不高,string s的所有内容都必须复制)?
【问题讨论】:
-
它可能效率不高,但插入与向前移动其他内容相比,没有办法实现这一点。你甚至可以说这有点快,因为它不必检查是否在第一个字符之前移动字符
-
@Athosvk:尽管除非它由 SSO 处理,否则使用
+将始终需要分配一个缓冲区。 -
效率参数基本上就是这样:你的添加
+分配了一个不必要的临时对象(至少在gcc/clang下,生成的程序集真的很丑)。但请注意,例如c + std::move(s)可以等同于使用insert()。insert()可能仍然需要重新分配内部字符串缓冲区(假设不涉及小字符串优化),因此无论哪种方式都不会赢得太多。这不太可能成为问题,因此请继续解决更重要的问题:) -
@amon Imo 这是一个很好的答案。你为什么把它作为评论发布?
-
@besc 写一个好的答案比写评论更难。此外,我不会为我投票结束的问题写答案。为什么我关门了?该站点的范围更多地是关于软件工程概念和设计级别的问题。这个问题显然是代码级别的,这样的问题更适合 Stack Overflow。
标签: c++ string performance c++14