istringstream、ostringstream和stringstream有什么区别?为什么不能在所有情况下都使用stringstream?

212

我什么时候会使用std::istringstreamstd::ostringstreamstd::stringstream?为什么不能在任何情况下都只使用std::stringstream(是否存在运行时性能问题?)。

最后,对于这种情况(而不是根本不使用流),有什么不好的地方吗:

std::string stHehe("Hello ");

stHehe += "stackoverflow.com";
stHehe += "!";
8个回答

155
个人而言,我认为很少需要对同一字符串流进行输入输出流操作。
通常我要么从一个字符串初始化流并解析它,要么将东西流到字符串流中,然后提取结果并存储它。
如果你对同一个流进行输入输出流,你必须非常小心地处理流状态和位置。
使用 '只是' istringstream 或 ostringstream 更能表达您的意图,并且可以防止愚蠢的错误,如意外使用 << vs >>。
这样做可能会有一些性能提升,但我不会首先考虑这一点。
你写的没有问题。如果你发现它的性能不够好,那么你可以对其他方法进行分析,否则就坚持最清晰的。个人而言,我会选择:
std::string stHehe( "Hello stackoverflow.com!" );

35
一个 stringstream 大小稍微大一些,速度可能略低 -- 多重继承可能需要调整vtable指针。主要区别是(至少在理论上)更好地表达你的意图,并防止你不小心使用 >> 代替 <<(或者反之亦然)。但另一方面,这种差异非常小,特别是对于快速演示代码等,我通常会懒惰地只使用 stringstream。我几乎记不起上一次不小心使用了 << 当我本意是用 >> 时,所以对我来说,这种安全性大多数是理论性的(特别是因为如果你确实犯了这样的错误,它几乎总是很明显的)。
使用字符串也没有什么问题,只要它能完成你想要的功能。如果你只是拼接字符串,那么使用字符串很容易且效果良好。但如果你想格式化其他类型的数据,stringstream 就可以支持,而字符串就不能完全胜任。

27

在大多数情况下,您不需要在同一个stringstream上同时使用输入和输出,因此显式地使用 std::ostringstreamstd::istringstream 可以使您的意图更加清晰。这还可以防止您意外输入错误的运算符(<<>>)。

当您需要对同一流执行两个操作时,您将使用通用版本。

性能问题在这里是您最不用担心的事情,清晰度是主要优点。

最后,使用字符串附加作为构造纯字符串的方法没有问题。但与perl等语言中的方式不同,您无法使用它来组合数字。


14

istringstream 用于输入,ostringstream 用于输出。stringstream 可以输入和输出。 你几乎可以在任何地方使用 stringstream。 但是,如果您将您的对象交给另一个用户,并且它使用了 operator >>,而您期望的是一个只写对象,那么您会感到不满意;-)

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


4

std::ostringstream::str() 函数会创建一个流内容的副本,在某些情况下会导致内存使用量加倍。为避免此问题,您可以使用 std::stringstream 和它的 rdbuf() 函数。

更多细节请参考:如何将 ostringstream 直接输出到 cout?


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

1

假设只有插入或提取适用于您的操作,您可以使用其中一个'i'或'o'前缀版本来排除不需要的操作。

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

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


0
为什么要以读/写方式打开文件,如果你只需要从中读取内容呢?
如果多个进程需要从同一个文件中读取内容怎么办?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接