istringstream,ostringstream和stringstream有什么区别? /为什么不在任何情况下使用stringstream?

我什么时候会使用std::istringstreamstd::ostringstreamstd::stringstream ,为什么不应该在每个场景中使用std::stringstream (是否有任何运行时性能问题?

最后,有什么不好的(而不是使用stream):

 std::string stHehe("Hello "); stHehe += "stackoverflow.com"; stHehe += "!"; 

就我个人而言,我觉得我很less想要执行stream入和stream出相同的stringstream。

通常我想要从一个string初始化一个stream,然后parsing它; 或者将某些东西stream式传输到stringstream中,然后提取结果并存储起来。

如果你正在stream入和stream出同一个stream,你必须非常小心stream的状态和stream的位置。

使用' istringstream或者ostringstream更好地expression你的意图,并且可以检查一些愚蠢的错误,比如意外地使用<< vs >>

可能会有一些性能改善,但我不会首先看。

你写的东西没有错。 如果发现效果不好,那么你可以分析其他方法,否则坚持最清楚。 就我个人而言,我只是想:

 std::string stHehe( "Hello stackoverflow.com!" ); 

一个stringstream比较大,性能可能稍低 – 多重inheritance可能需要调整vtable指针。 主要区别在于(至less在理论上)更好地expression了您的意图,并防止您意外地使用>> (或反之亦然)。 OTOH,差别是足够小,尤其是对于快速演示代码等等,我很懒,只是使用stringstream 。 我不记得最后一次意外使用<<当我打算<<时候,所以对我而言,这一点安全似乎主要是理论上的(特别是如果你犯了这样一个错误,几乎总是会变得非常明显立即)。

只要使用一个string,没有任何问题,只要它能完成你想要的。 如果你只是把string放在一起,这很容易,工作正常。 如果你想格式化其他types的数据,一个stringstream将支持,而一个string大多不会。

在大多数情况下,你不会在同一个stringstream上同时需要input和输出,所以使用std::ostringstreamstd::istringstream明确地expression了你的意图。 它也可以防止你意外地input错误的操作符( << vs >> )。

当你需要在同一个stream上执行两个操作时,你显然会使用通用版本。

性能问题将是您在这方面最担心的问题,清晰度是主要的优势。

最后,使用string追加没有任何问题,因为您必须构build纯string。 你不能用它来像perl这样的语言结合数字。

istringstream是input,ostringstream是输出。 stringstream是input和输出。 你可以在任何地方使用stringstream。 然而,如果你把你的对象给另一个用户,并且它使用操作符>>而在等待只写对象的地方,你将不会高兴;-)

PS:没什么不好的,只是性能问题。

回答你的第三个问题:不,这是完全合理的。 使用stream的优点是可以input任何types的具有operator<<定义的operator<<的值,而只能将string(C ++或C)添加到std::string

假定只有插入或只有提取适合您的操作,您可以使用“i”或“o”前缀之一来排除不需要的操作。

如果这不重要,那么你可以使用I / O版本。

你显示的string连接是完全有效的。 虽然使用stringstream进行连接是可能的,但这并不是stringstreams最有用的function,可以插入和提取POD和抽象数据types。

为什么打开一个文件进行读/写访问,如果你只需要从它读取,例如?

如果多个进程需要从同一个文件读取呢?