如何将ostringstream直接写入cout
Posted
技术标签:
【中文标题】如何将ostringstream直接写入cout【英文标题】:how to write ostringstream directly to cout 【发布时间】:2013-03-26 05:18:34 【问题描述】:如果我有一个名为oss
的std::ostringstream
对象,我知道我可以使用std::cout << oss.str()
来打印出字符串。但是执行oss.str()
会导致返回的字符串被复制。有没有办法直接打印底层的streambuf
?
提前致谢!
【问题讨论】:
【参考方案1】:如果您使用的是std::ostringstream
,则不会。无法从中读取底层缓冲区(因此ostringstream
中的o
),因此您必须依靠实现通过str()
为您完成。
但是,如果您使用std::stringstream
(注意缺少o
),则底层缓冲区是可读的,并且basic_ostream
具有从缓冲区读取的特殊重载:
#include <iostream>
#include <sstream>
int main()
std::stringstream ss1;
ss1 << "some " << 111605 << " stuff" << std::flush;
std::cout << ss1.rdbuf() << std::endl;
std::cout << ss1.str() << std::endl;
输出:
一些 111605 的东西 一些 111605 的东西
(Example derived from here.)
这直接从底层缓冲区复制,没有中间副本。
【讨论】:
谢谢!您的解决方案有效。我还发现这篇文章***.com/questions/10009809/… 使用 ostream 来实现相同的目的。我只是想知道使用 ostream 和 stringstream 有什么区别。哪个性能更好? @WinstonHuang:您必须对其进行分析以找出哪个性能更高。我怀疑它是否更快,而且它肯定比使用std::stringstream
更复杂。
在 gcc 9.1.0 上试过。无论如何std::cout << ss1.str()
更快。 (stdout 被重定向到 /dev/null)。
coliru.stacked-crooked.com/a/d4ffa641487aa4cf以上是关于如何将ostringstream直接写入cout的主要内容,如果未能解决你的问题,请参考以下文章
如何清除 std::ostringstream 实例以便可以重用? [复制]
使用 ostringstream 或 stringstream 将 C++ Int 转换为字符串