当我会用std::istringstream
,std::ostringstream
以及std::stringstream
为什么不应该我只是用std::stringstream
在所有情况(是否有任何的运行时性能问题?)。
最后,这有什么不好的地方(而不是根本不使用流):
std::string stHehe("Hello ");
stHehe += "stackoverflow.com";
stHehe += "!";
当我会用std::istringstream
,std::ostringstream
以及std::stringstream
为什么不应该我只是用std::stringstream
在所有情况(是否有任何的运行时性能问题?)。
最后,这有什么不好的地方(而不是根本不使用流):
std::string stHehe("Hello ");
stHehe += "stackoverflow.com";
stHehe += "!";
Answers:
就个人而言,我发现很少要执行流入和流出同一字符串流的操作。
通常我想从一个字符串初始化一个流,然后解析它;或将内容流式传输到字符串流,然后提取结果并存储。
如果要在同一流之间来回传输,则必须非常注意流状态和流位置。
使用“只是” istringstream
或ostringstream
更好的表达你的意图,让您对愚蠢的错误,如意外使用的一些检查<<
VS >>
。
有可能会有一些性能改进,但我不会在第一次看。
您编写的内容没有错。如果发现它的性能不够好,则可以介绍其他方法,否则请坚持最清晰的方法。就个人而言,我只是去:
std::string stHehe( "Hello stackoverflow.com!" );
A stringstream
稍大一些,并且性能可能稍低-多重继承可能需要调整vtable指针。主要区别在于(至少在理论上)更好地表达了您的意图,并防止了您意外地使用>>
您的意图<<
(反之亦然)。OTOH,差异很小,尤其是对于快速的演示代码位,我很懒,只是使用stringstream
。我不太记得上一次我不小心使用<<
时的意图>>
,所以对我来说,安全性似乎大部分是理论上的(特别是因为如果您确实犯了这样的错误,几乎总是真的马上明显地看出来)。
只要使用字符串,只要完成您想要的操作,就没有错。如果您只是将字符串组合在一起,那么这很容易并且可以正常工作。如果您想格式化其他类型的数据,a stringstream
将支持该格式,而字符串则大部分不支持。
std :: ostringstream :: str()创建流内容的副本,这在某些情况下会使内存使用量增加一倍。您可以改用std :: stringstream及其rdbuf()函数来避免这种情况。
此处有更多详细信息:如何将ostringstream直接写入cout
例如,如果只需要从文件中读取文件,为什么还要打开文件以进行读/写访问?
如果需要多个进程读取同一文件怎么办?