【问题标题】:ostringstream, .str(), and reseting/clearing the streamostringstream、.str() 和重置/清除流
【发布时间】:2014-01-22 14:04:35
【问题描述】:

我正在从Memory Error with std:ostringstream and -std=c++11? 舔我的伤口,我有一个相关的问题。

如果以下返回一个临时值,使reserve 无效且char* 无效:

ostringstream oss;
oss.str().reserve(96);

// populate oss

const char* ptr = oss.str().c_str();
// do something with ptr

那么下面怎么清除ostringstream(来自How to reuse an ostringstream?):

oss.clear(); oss.str("");

我知道clear() 将重置流的标志;但据我现在了解,str("") 将在临时字符串上运行,而不是在底层字符串上运行。

那么str("") 是如何重置流的呢?

【问题讨论】:

    标签: c++ string stringstream temporary-objects


    【解决方案1】:

    这些是不同的功能。

    oss.str()(不带参数)返回流的底层字符串的副本,但oss.str("") 它的底层字符串设置为您传递的值(这里是一个空字符串:"")。

    所以在std::stringstream 上同时调用clear()str("") 实际上有点“重置”它。

    注意cppreference上的两个签名

    【讨论】:

    • clear() 重置错误标志。 str("") 用给定的字符串替换输入数据。两者完全无关。
    • 准确地说:oss.str() 返回流底层字符串的 copy。在这种情况下,它是一个副本这一事实很重要。
    • 感谢 JBL。我无法告诉你我访问了多少次不同的 CCP 参考页面。我认为 C++ 委员会超载了 .str() 的行为和语义(在一种情况下是临时的,在另一种情况下是伪引用),这有点糟糕。这正是我认为 .str() 返回对底层字符串的引用的原因。
    • @noloader 啊,但这是否令人困惑是完全不同的争论! :P 然后,当您说“str 具有不同的行为和含义取决于它的使用方式”时,我会说“有两个 str 函数,哪一个?”。我已经习惯了,所以我并没有真正看到那里的问题,但我可以理解它可能造成的混乱。
    • @noloader 在这种情况下,委员会简单地采用了一个普遍存在的 C++ 习惯用法:使用属性名称重载函数,使用不带参数的 const 版本作为 getter,以及使用新值的非 const 版本作为二传手。
    【解决方案2】:

    不带参数调用str 会返回内部字符串对象的副本。这就是为什么它是一个临时对象。使用字符串参数调用str 会设置内部字符串对象的值。它不适用于临时对象。

    看来你是这样想的:

    oss.str() = "";
    

    但事实并非如此。您将 "" 传递给 str 函数,以便它可以将其分配给内部字符串。

    这与任何其他 getter/setter 组合没有什么不同。如果您有getX(),它通常会为您提供您正在调用它的类的某个成员的副本。如果您有setX(x),它通常会设置该成员的值。在这种情况下,它们都被称为 str,但一个接受参数,另一个不接受。

    【讨论】:

    • "...它通常会为您提供您正在调用它的班级的某个成员的副本" - 实际上我在大学里学到了不同的东西(大约 20 年前)。如果副本很昂贵,则返回参考,而不是副本。字符串是一个昂贵的对象,因为它需要调用new 和调用memcpy。因此,您将为str() 提供constnon-const 版本(在我的假设和错误信息的情况下)。
    【解决方案3】:

    来自this std::ostringstream::str reference

    参数

    new_str - 底层字符串的新内容

    可用于获取字符串,或将字符串设置为functions参数提供的字符串。

    【讨论】:

      猜你喜欢
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      • 2019-06-30
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多