我知道使用std::stringstream
的优势之一是它是一个std::istream
,因此可以从定义了operator<<
到std::istream
的任何类型以及原始类型中接受输入。
我不打算使用operator<<
;相反,我只想连接许多字符串。与使用std::string
连接多个字符串相比,std::stringstream
的实现使其更快吗?
我知道使用std::stringstream
的优势之一是它是一个std::istream
,因此可以从定义了operator<<
到std::istream
的任何类型以及原始类型中接受输入。
我不打算使用operator<<
;相反,我只想连接许多字符串。与使用std::string
连接多个字符串相比,std::stringstream
的实现使其更快吗?
std::string
的附加函数比stringstream
的插入函数慢。通常,std::string
只是可能会有一个内存分配/复制以及将数据复制到内存中。即使是基本的write
调用,stringstream
也需要处理像本地化等问题。std::string
提供了减少或消除除第一个内存分配以外的任何东西的方法。如果您reserve
了足够的空间,每次插入都只是memcpy
。这在stringstream
中并不容易实现。std::string
的附加函数快,您仍然必须将字符串从stringstream
中复制出来才能对其进行操作。因此,这是另一个分配+复制,而使用std::string
则不需要。尽管至少C++20看起来将要消除这种特定需要。std::stringstream
。<<
进行连接(它可以与std::cout
、std::cerr
、std::stringstream
一起使用),但它不能与std::string
一起使用。难道我真的需要为此编写一个小包装器来包装std::string
吗? - gnzlbgoperator<<
的std::string,它可以拼接字符串并且运行良好。我刚刚保留了最终大小,在连接完成后将字符串移出。感觉像是石器时代:string有“append”和“operator+”,而“streams”则有“write”和“operator<<”... - gnzlbg
.append()
/operator+=
? - Rapptzappend()
和operator+=
。 - André Puelostream
而不是istream
? - TooTone