我知道所有类型的ostream都拥有自己的内部缓冲区。 我必须知道是否有某种ostream接受一个实例std :: string并在该实例上写入。
(我想避免冗余副本)
注意:我的问题是关于标准库,不提供其他可以做到这一点的库,我知道它们存在。 :)
修改:请求更具体...以下是我想要的内容,请考虑以下代码:
std::string str = "bla bla bla ";
std::ospecialstream o(str);
o << 34 << " bla bla";
std::cout << str; //console output : "bla bla bla 34 bla bla"
我想要ospecialstream,它不会将str内容复制到某个内部缓冲区,而是写入str的同一个实例。
编辑#2 出于性能原因我需要它,ostringstream在使用字符串创建时会生成memcopy,并且在检索内容时也会生成memcpy。
答案 0 :(得分:3)
std::ostringstream
sstream
标题的一部分。
这个怎么样:
void appendStuff(string& in) {
ostringstream os;
os << 34 << " bla bla";
in += os.str();
}
答案 1 :(得分:2)
如果你问你可以改变ostreams的缓冲,那么答案是肯定的。但是,根据您实际需要缓冲区的操作,这不是一项特别简单的任务。您需要查阅Langer & Kreft等书籍以获取更多信息。
L&amp; K有一个如何实现无缓冲输出流的示例 - 它从本书的第229页开始。这里重现太长了,但基本上你需要重新定义派生的streambuf类的overflow()方法。
请注意,该图书不在线提供,但源代码显然是 - 请参阅此page了解详细信息。
答案 2 :(得分:1)
简答:没有
答案很长:是的,但这需要编写您自己的streambuf
课程,然后使用rdbuf
进行设置。此外,现在已弃用的strstream几乎可以执行您想要的操作,并且可能仍在您的编译器库中。
答案 3 :(得分:1)
#include <iostream>
#include <string>
class intostring : public std::basic_streambuf<char> {
std::string &str;
public:
intostring(std::string &pstr):str(pstr) {}
virtual std::streamsize xsputn(const char *const p, const std::streamsize n) {
str.append(p, n);
}
};
int main() {
std::string s("Original string: ");
intostring newbuf(s);
std::streambuf *oldbuf = std::cout.rdbuf(&newbuf);
std::cout << "Should go to string" << std::endl;
std::cout.rdbuf(oldbuf);
std::cout << "Should go to console again ... and here's the string: '"
<< s << "'" << std::endl;
}
输出:
应该再次进入控制台...这里是字符串:'原始字符串:应该转到字符串'