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

StackOverflow https://stackoverflow.com/questions/3292107

我什么时候用 std::istringstream, std::ostringstreamstd::stringstream 为什么我不应该使用 std::stringstream 在每种情况下(是否存在运行时性能问题?)。

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

std::string stHehe("Hello ");

stHehe += "stackoverflow.com";
stHehe += "!";
有帮助吗?

解决方案

就我个人而言,我发现很少需要在同一字符串流中执行流式传输。

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

如果您在同一个流之间进行流式传输,则必须非常小心流状态和流位置。

使用“只是” istringstream 或者 ostringstream 更好地表达您的意图,并为您提供一些检查以防止愚蠢的错误,例如意外使用 <<>>.

那里 可能 是一些性能改进,但我不会首先考虑这一点。

你写的没有什么问题。如果您发现它的性能不够好,那么您可以分析其他方法,否则坚持使用最清晰的方法。就我个人而言,我只想:

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

其他提示

A stringstream 稍大一些,并且性能可能稍低——多重继承可能需要调整 vtable 指针。主要区别是(至少在理论上)更好地表达您的意图,并防止您意外使用 >> 你打算去的地方 << (或相反亦然)。OTOH,差异足够小,特别是对于快速的演示代码等,我很懒,只是使用 stringstream. 。我不太记得上次不小心使用是什么时候了 << 当我打算 >>, ,所以对我来说,安全性似乎主要是理论上的(特别是因为如果你 犯这样的错误,几乎总是会发生 真的 几乎立即显而易见)。

仅仅使用字符串并没有什么问题,只要它能达到你想要的效果即可。如果您只是将字符串放在一起,那么很容易并且效果很好。如果您想格式化其他类型的数据, stringstream 会支持这一点,而字符串大多不会。

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

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

性能问题在这里是您最不关心的问题,清晰度是主要优势。

最后,使用字符串附加没有任何问题,因为您必须构造纯字符串。您只是不能像在 perl 等语言中那样使用它来组合数字。

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

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

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

据推测,当仅插入或仅提取适合您的操作时,您可以使用“i”或“o”前缀版本之一来排除不需要的操作。

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

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

std::ostringstream::str() 创建流内容的副本,这在某些情况下会使内存使用量增加一倍。您可以使用 std::stringstream 及其 rdbuf() 函数来避免这种情况。

更多详细信息请参见此处: 如何将ostringstream直接写入cout

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top