std::stringstream与std::string在连接多个字符串时的区别

62

我知道使用std::stringstream的优势之一是它是一个std::istream,因此可以从定义了operator<<std::istream的任何类型以及原始类型中接受输入。

我不打算使用operator<<;相反,我只想连接许多字符串。与使用std::string连接多个字符串相比,std::stringstream的实现使其更快吗?


1
与什么相比?.append()/operator+= - Rapptz
3
我认为用.reserve()加上多个 .append()/+= 应该相当高效。在C++中,字符串不像Java/C#等语言中是不可变的,因此没有必要使用StringBuilder类型的类。 - Bwmat
@Rapptz 是的。append()operator+= - André Puel
1
@Bwmat 我不知道最终的大小会是多少,实际上。 - André Puel
嗯,即使没有保留区,情况也不会太糟。我希望它们像向量一样呈指数增长,但我不确定。 - Bwmat
1
你是不是想说 ostream 而不是 istream - TooTone
1个回答

81
没有理由认为std::string的附加函数比stringstream的插入函数慢。通常,std::string只是可能会有一个内存分配/复制以及将数据复制到内存中。即使是基本的write调用,stringstream也需要处理像本地化等问题。
此外,std::string提供了减少或消除除第一个内存分配以外的任何东西的方法。如果您reserve了足够的空间,每次插入都只是memcpy。这在stringstream中并不容易实现。
即使它比std::string的附加函数快,您仍然必须将字符串从stringstream中复制出来才能对其进行操作。因此,这是另一个分配+复制,而使用std::string则不需要。尽管至少C++20看起来将要消除这种特定需要。
如果您需要格式化,而不仅仅是将一些字符串粘合在一起,应该使用std::stringstream

那么如果我只需要将一些字符串拼接在一起,我该使用什么?我已经知道了结果字符串的确切大小,所以我想要预先分配它,但是将字符串粘合在一起的代码需要一个OStream,并使用<<进行连接(它可以与std::coutstd::cerrstd::stringstream一起使用),但它不能与std::string一起使用。难道我真的需要为此编写一个小包装器来包装std::string吗? - gnzlbg
我刚刚写了一个小封装,围绕着一个带有operator<<的std::string,它可以拼接字符串并且运行良好。我刚刚保留了最终大小,在连接完成后将字符串移出。感觉像是石器时代:string有“append”和“operator+”,而“streams”则有“write”和“operator<<”... - gnzlbg
12
请添加一些基准来支持你的答案。 - Jaideep Shekhar
1
虽然stringstream本身并不更快,但在字符串连接方面,它更容易以高效的方式使用(避免临时变量/动态内存分配)。请参见https://learning.oreilly.com/library/view/optimized-c/9781491922057/ch04.html(Kurt Guntheroth的《Optimized C ++》第4章)。 - paleonix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接