2013-03-26 40 views
9

如果我有一個std::ostringstream對象叫做oss,我明白我可以做​​來打印出字符串。但是做oss.str()會導致被複制的返回字符串。有沒有辦法直接打印底層streambuf如何直接寫ostringstream到cout

在此先感謝!

回答

9

如果您使用的是std::ostringstream,則不適用。無法從中讀取底層緩衝區(因此的ostringstream),因此您必須依靠實施通過str()爲您執行此操作。

但是,如果你使用std::stringstream(注意缺乏o),那麼潛在的緩衝區是可讀的,basic_ostream的有一個特殊的過載從緩衝區ForReading的:

#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。)

這從底層緩衝區直接複製,沒有中間副本。

+0

謝謝!你的解決方案有效我也發現這個帖子http://stackoverflow.com/questions/10009809/query-stdostringstream-content/10010160#10010160其中ostream是用來實現同樣的事情。我只是想知道使用ostream和stringstream有什麼區別。哪一個更高性能? – 2013-03-26 14:13:43

+0

@WinstonHuang:你必須對它進行分析以找出哪個更高效。我懷疑它有更快的速度,而且比使用'std :: stringstream'更加複雜。 – GManNickG 2013-03-26 15:29:08