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


163

当我会用std::istringstreamstd::ostringstream以及std::stringstream为什么不应该我只是用std::stringstream在所有情况(是否有任何的运行时性能问题?)。

最后,这有什么不好的地方(而不是根本不使用流):

std::string stHehe("Hello ");

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

Answers:


119

就个人而言,我发现很少要执行流入和流出同一字符串流的操作。

通常我想从一个字符串初始化一个流,然后解析它;或将内容流式传输到字符串流,然后提取结果并存储。

如果要在同一流之间来回传输,则必须非常注意流状态和流位置。

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

可能会有一些性能改进,但我不会在第一次看。

您编写的内容没有错。如果发现它的性能不够好,则可以介绍其他方法,否则请坚持最清晰的方法。就个人而言,我只是去:

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

22

A stringstream稍大一些,并且性能可能稍低-多重继承可能需要调整vtable指针。主要区别在于(至少在理论上)更好地表达了您的意图,并防止了您意外地使用>>您的意图<<(反之亦然)。OTOH,差异很小,尤其是对于快速的演示代码位,我很懒,只是使用stringstream。我不太记得上一次我不小心使用<<时的意图>>,所以对我来说,安全性似乎大部分是理论上的(特别是因为如果您确实犯了这样的错误,几乎总是真的马上明显地看出来)。

只要使用字符串,只要完成您想要的操作,就没有错。如果您只是将字符串组合在一起,那么这很容易并且可以正常工作。如果您想格式化其他类型的数据,a stringstream将支持该格式,而字符串则大部分不支持。


17

在大多数情况下,您不会发现自己需要在同一字符串流上同时进行输入和输出,因此使用std::ostringstreamstd::istringstream明确地使您的意图明确。它还可以防止您意外输入错误的运算符(<<vs >>)。

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

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

最后,使用字符串附加没有什么错,因为您必须构造纯字符串。您只是不能像使用perl这样的语言那样使用它来组合数字。


8

istringstream用于输入,ostringstream用于输出。stringstream是输入和输出。您几乎可以在任何地方使用stringstream。但是,如果将对象提供给另一个用户,并且使用运算符>>,而在等待只写对象的对象,您将不会满意;-)

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


2

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


1

大概当仅插入或仅提取适合于您的操作时,您可以使用'i'或'o'前缀版本之一来排除不需要的操作。

如果那并不重要,则可以使用I / O版本。

您显示的字符串串联是完全有效的。尽管使用stringstream进行连接是可能的,但这不是stringstream的最有用的功能,该功能将能够插入和提取POD和抽象数据类型。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.