【发布时间】:2014-04-30 13:37:37
【问题描述】:
我有一个名为std::string,我想通过std::ostream 接口填充数据并避免复制字符串。
一种涉及副本的方法是这样做:
bool f(std::string& out)
{
std::ostringstream ostr;
fillWithData(ostr);
out = ostr.str(); // 2 copies here
return true;
}
我需要通过out 传递结果,并且无法返回 ostr.str()。
我想避免out = ostr.str(); 中的副本,因为这个字符串可能非常 大。
有没有办法,可能使用rdbuf()s,将std::ostream 缓冲区直接绑定到out?
澄清一下,我我对std::string 和std::ostream 的自动扩展行为感兴趣,这样调用者就不必在调用前知道大小。
更新:我刚刚意识到out = ostr.str(); 的无害行可能需要 2 个副本:
- 第一个由
str()调用 - 另一个由
std::string赋值运算符。
【问题讨论】:
-
看起来不可能。您的函数
f可以将std::ostringstream &作为参数吗? -
您想要做的问题是 C++ 标准不要求 std::string_buf 的内部缓冲区是 std::string
-
@DidierTrosset:不是这样。
std::ostringstream的内部使用是一个实现细节。 -
注意:第二个副本(赋值)可能已经优化(应该没问题)
标签: c++ stdstring ostringstream