【问题标题】:What's the difference between istringstream, ostringstream and stringstream? / Why not use stringstream in every case?istringstream、ostringstream 和 stringstream 有什么区别? / 为什么不在每种情况下都使用 stringstream?
【发布时间】:2011-03-18 13:15:54
【问题描述】:

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

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

std::string stHehe("Hello ");

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

【问题讨论】:

    标签: c++ string stringstream ostringstream istringstream


    【解决方案1】:

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

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

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

    使用“just”istringstreamostringstream 可以更好地表达您的意图,并让您检查一些愚蠢的错误,例如意外使用 <<>>

    可能会有一些性能改进,但我不会首先考虑。

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        只使用一个字符串没有任何问题,只要它完成你想要的。如果您只是将字符串放在一起,那很容易并且效果很好。但是,如果您想格式化其他类型的数据,stringstream 将支持该格式,而字符串大多不支持。

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              【解决方案6】:

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

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

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

              【讨论】:

                【解决方案7】:

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

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

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

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

                【讨论】:

                  【解决方案8】:

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

                  更多详情:how to write ostringstream directly to cout

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-12-03
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2022-01-03
                    • 2011-02-25
                    相关资源
                    最近更新 更多