C++ std::stringstream与std::string用于连接多个字符串

C++ std::stringstream与std::string用于连接多个字符串,c++,string,stringstream,C++,String,Stringstream,我知道std::stringstream的优点之一是它是std::istream,因此它可以接受定义运算符的任何类型的输入没有理由期望std::string的附加函数比stringstream的插入函数慢标准::字符串通常只不过是一个可能的内存分配/复制加上将数据复制到内存中stringstream必须处理区域设置等问题,即使对于基本的write调用也是如此 另外,std::string提供了最小化或消除除第一次内存分配之外的任何内容的方法。如果保留了足够的空间,那么每次插入都只不过是一个mem

我知道
std::stringstream
的优点之一是它是
std::istream
,因此它可以接受定义
运算符的任何类型的输入没有理由期望
std::string
的附加函数比
stringstream
的插入函数慢<代码>标准::字符串
通常只不过是一个可能的内存分配/复制加上将数据复制到内存中
stringstream
必须处理区域设置等问题,即使对于基本的
write
调用也是如此

另外,
std::string
提供了最小化或消除除第一次内存分配之外的任何内容的方法。如果
保留了足够的空间,那么每次插入都只不过是一个
memcpy
。这在
stringstream
中是不可能的

即使它比
std::string
的附加函数快,您仍然需要将字符串从
stringstream
中复制出来才能对其进行处理。这是另一个分配+拷贝,您不需要使用
std::string
。尽管至少C++20看起来可以消除这种特殊需求


如果需要格式化,您应该使用
std::stringstream
,而不仅仅是为了将一些字符串粘在一起。

没有理由期望
std::string
的附加函数比
stringstream
的插入函数慢<代码>标准::字符串
通常只不过是一个可能的内存分配/复制加上将数据复制到内存中
stringstream
必须处理区域设置等问题,即使对于基本的
write
调用也是如此

另外,
std::string
提供了最小化或消除除第一次内存分配之外的任何内容的方法。如果
保留了足够的空间,那么每次插入都只不过是一个
memcpy
。这在
stringstream
中是不可能的

即使它比
std::string
的附加函数快,您仍然需要将字符串从
stringstream
中复制出来才能对其进行处理。这是另一个分配+拷贝,您不需要使用
std::string
。尽管至少C++20看起来可以消除这种特殊需求


如果需要格式化,您应该使用
std::stringstream
,而不仅仅是为了将一些字符串粘在一起。

与什么相比
.append()
/
运算符+=
?我认为一个.reserve()后跟多个.append()/+=应该非常有效。在C++中,字符串不是不可变的,就像它们在爪哇/ C·{等中一样,所以没有任何理由使用StrugBuudier-Type类。@ RAPTZ是的。code>append()
operator+=
@Bwmat我不知道最终的大小是多少,实际上你是说
ostream
而不是
istream
?与什么相比
.append()
/
运算符+=
?我认为一个.reserve()后跟多个.append()/+=应该非常有效。在C++中,字符串不是不可变的,就像它们在爪哇/ C·{等中一样,所以没有任何理由使用StrugBuudier-Type类。@ RAPTZ是的。code>append()和
operator+=
@Bwmat我不知道最终的大小,实际上你是说
ostream
而不是
istream
?那么,如果我只需要把一些字符串粘在一起,我该怎么做呢?我确切地知道结果字符串的大小,所以我想预先分配它,但是将字符串粘在一起的代码需要一个OStream并使用
我刚刚用
运算符在std::string周围编写了一个小包装器。请添加一些基准来支持您的答案。虽然stringstream本身并不更快,在连接字符串时,它更容易以有效的方式使用(避免临时/动态内存分配)。请参阅(Kurt Guntheroth的《优化的C++》一书的第4章),如果我只需要将一些字符串粘在一起,我应该使用什么呢?我确切地知道结果字符串的大小,所以我想预先分配它,但是将字符串粘在一起的代码需要一个OStream并使用
我刚刚用
运算符在std::string周围编写了一个小包装器。请添加一些基准来支持您的答案。虽然stringstream本身并不更快,在连接字符串时,它更容易以有效的方式使用(避免临时/动态内存分配)。参见(Kurt Guntheroth的《优化的C++》一书的第4章)