2010-07-20 76 views
122

何时使用std::istringstreamstd::ostringstreamstd::stringstream以及为什么我不应该在每种情况下都使用std::stringstream(是否存在运行时性能问题?)。istringstream,ostringstream和stringstream有什么区别? /为什么不在每种情况下使用stringstream?

最后,有什么不好这个(而不是用流的话):

std::string stHehe("Hello "); 

stHehe += "stackoverflow.com"; 
stHehe += "!"; 
+1

谢谢所有您的有用答案和您的时间:x – 2010-07-20 17:37:01

回答

84

就个人而言,我觉得非常难得,我想执行的流进和流出相同的字符串流。

通常我想要从一个字符串初始化一个流,然后解析它;或将某些东西流式传输到字符串流中,然后提取结果并将其存储起来。

如果您要流入和流出同一个流,则必须非常小心流状态和流位置。

使用“只是” istringstreamostringstream更好的表达你的意图,让您对愚蠢的错误,如意外使用<< VS >>一些检查。

There 可能虽然有一些性能改善,但我不会首先考虑这一点。

你写的东西没有问题。如果你发现它表现不佳,那么你可以描述其他方法,否则坚持最清晰。就个人而言,我只是想:

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

谢谢您为您提供的信息非常丰富! 我开始笑,当我看到你的答案的最后一点(代码部分):D 当然,我发布的例子没有很好的选择。 – 2010-07-20 17:36:35

4

istringstream是输入,ostringstream输出。 stringstream是输入和输出。 你可以在任何地方使用stringstream。 但是,如果你给你的对象给其他用户,并使用运营商>>而你在那里等待一个只写对象,你也不会开心;-)

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

16

A stringstream稍大,性能可能稍低 - 多继承可能需要调整vtable指针。主要的区别是(至少在理论上)更好地表达你的意图,并防止你意外使用>>,如果你打算<<(反之亦然)。 OTOH,差别非常小,特别是对于快速演示代码等,我很懒,只是使用stringstream。我不记得最后一次我意外地使用<<当我打算>>,所以对我来说这一点安全似乎主要是理论(尤其是因为如果你做出这样的错误,它几乎总是真的几乎立即显而易见)。

只要使用一个字符串,只要它完成了你想要的就没什么错。如果你只是把字符串放在一起,这很容易,工作正常。如果你想格式化其他类型的数据,stringstream将支持,而字符串大多不会。

0

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

如果需要从同一文件中读取多个进程,该怎么办?

2

回答你的第三个问题:不,这是完全合理的。使用流的优点是您可以输入定义了operator<<的任何类型的值,而只能将字符串(C++或C)添加到std::string

1

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

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

您显示的字符串连接完全有效。虽然使用stringstream进行连接是可能的,但这不是stringstreams最有用的特性,它可以插入和提取POD和抽象数据类型。

14

在大多数情况下,您不会在同一个字符串流中找到自己需要的输入和输出,因此使用std::ostringstreamstd::istringstream明确表示您的意图清晰。它还可以防止您意外键入错误的操作员(<< vs >>)。

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

性能问题将成为您最担心的问题,清晰度是主要优势。

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

相关问题