如果经常将字符串连接起来以形成最终结果,那么最佳做法是什么? (在C ++ 11或更高版本中)
string::append()
或ostringstream
怎么样?
另一个问题:如果我使用许多+
连接字符串,现代编译器会以最有效的方式对其进行优化吗? (就像Java现在可以使用StringBuilder优化字符串concat一样)
答案 0 :(得分:2)
如果您不需要std::ostringstream
的任何功能,则如果最终目标是获得单个std::string
(并且事先充分调用reserve
可以省去一些无用的分配)。内部std::ostringstream
的工作方式大致相同,但是额外的层会增加一些开销。
另一个问题:如果我使用许多
+
连接字符串,现代编译器会以最有效的方式对其进行优化吗? (就像Java现在可以使用StringBuilder优化字符串concat一样)
std::string
已经类似于StringBuilder
,因为它是一种可变类型,可以高效地增长,因此您无需为此使用其他类型。
现在,在C ++ 03中,多个串联的+
将创建所有相关的临时字符串,因此,如果要保持效率,则必须在目标字符串上重复使用+=
OTOH,C ++ 11添加了operator+
的重载,该重载采用了右值引用,这允许为下一个串联回收/扩展临时字符串的分配存储,因此在大多数情况下,效率应该是可比的-谢谢@Daniel Schepler指出了这一点。
我认为这将无法实现的一种情况是
big_string += a + b + c;
在这种情况下,a + b + c
本身的计算效率很高,但没有考虑将其追加到另一个字符串的事实(因此,可能没有任何额外的分配)。使用“传统”方法或使用
big_string = std::move(big_string) + a + b + c;
答案 1 :(得分:2)
如果您以某种方式想到了管理领域中的StringBuilder。
您可以使用Alphabet(Google)库,ABCLib,ABCL或仅使用Abseil。
Abseil's Strings library向前看并立即分配所有需要的内容,然后根据需要在其中构建字符串。对于concat作业,您只需要absl :: StrCat()和absl :: StrAppend()。
我不善于解释事物。也许下面的godbolt链接可能比我说的好。
在YouTube上了解更多信息:CppCon 2017: Titus Winters “Hands-On With Abseil”(ffw至32分钟)
youtube.com/watch?v=xu7q8dGvuwk&t=32m
mcontext=getContext();