【问题标题】:Reference to value of STL map element?引用 STL 地图元素的值?
【发布时间】:2009-02-15 13:22:43
【问题描述】:

是否可以将映射元素值的引用传递给函数,并在那里修改它?

foo(string & s)
{
    s = "xyz";
}

map<int, string> m;
m[1] = "abc";
foo(m[1]); // <-- Is it ok? Will m[1] be "xyz" after this call?

谢谢。

【问题讨论】:

    标签: c++ stl map


    【解决方案1】:

    答案是肯定的。

    (运算符 [] 返回一个reference

    【讨论】:

      【解决方案2】:

      是的,我们可以。
      它也适用于std::vectors(而且由于您使用数字键,因此您可以考虑使用它们)。

      【讨论】:

      • 小心使用 vector::iterator (取消引用它不会产生引用)
      【解决方案3】:

      是的。

      这与键入 m[1] = "xyz" 没有什么不同。编译器完成后会将其简化为大致相同的内容。

      【讨论】:

        【解决方案4】:

        忠告:您可能希望将其作为指针而不是引用传递。我这样做是为了让普通读者更清楚它会被改变。

        这一切都是为了与必须维护此代码的下一个人进行清晰的沟通。

        但除此之外,是的,这是完全合法的代码!

        【讨论】:

        • 我非常不同意您的建议。我倾向于更喜欢引用,除非我要在某些情况下提供空指针。否则,恐怕我只是在创建另一种滥用代码的可能方式,即使用空指针而不是有效引用...
        • 1:可以传递空引用。它违反了语言协议,但可以做到。它使用核心转储的取消引用空值。 2:assert(x!=NULL) 开销低。 3:在调用点,考虑 foo(bar);与 foo(&bar);.这 & 清楚地表明栏已更改。我的意见。我的 0.02 美元。
        【解决方案5】:

        是的,这很好 - 正如每个人都已经说过的那样 - 而且,如果不是,您的编译器会告诉您。您可能想尝试一下;尝试将 "hello" 或 (42) 传递给 foo(string&) 以了解编译器给您的警告。

        【讨论】:

          猜你喜欢
          • 2021-05-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-22
          • 2020-08-23
          相关资源
          最近更新 更多