【问题标题】:Why does std::map not have a const accessor?为什么STD ::地图没有Const Accordor?
【发布时间】:2012-12-03 20:59:52
【问题描述】:

std::map 上 [] 运算符的声明如下:

T& operator[] ( const key_type& x );

不是这个有什么原因吗?

T& operator[] ( const key_type& x );
const T& operator[] const ( const key_type& x );

因为当您需要在 const 方法中访问成员映射时,这将非常有用。

【问题讨论】:

  • 哇,你参加了每周堆栈交换通讯:)
  • 呵呵,酷!你们有一些很好的答案,谢谢!

标签: c++ c++11 std


【解决方案1】:

从 C++11 开始,std::map::at 提供 const 和非 const 访问。

operator[] 相比,如果元素不在地图中,它将引发std::out_of_range 异常。

【讨论】:

  • 那是一个很棒的补充。
  • 这比写 foo.get(bar)->second 好多了,谢谢! =)
  • @Calder foo.find(bar)->second (not 'get') 只是坏了,除非你已经知道 foo 有一个以 bar 作为键的条目,否则它会返回一个不可取消引用迭代器...
【解决方案2】:

operator[] 在映射中返回指定键处的值如果该键不存在,则为该键创建一个新的值初始化元素,因此这是不可能的。

如果operator[]const 重载,则添加该元素将不起作用。

这回答了这个问题。替代方案:

对于C++03 - 您可以使用迭代器(这些是const 和非const 加上find)。在 C++11 中,您可以使用 at 方法。

【讨论】:

    【解决方案3】:

    这些答案是正确的,因为operator[] 具有添加不存在的键的语义,但我想添加另一个观点:

    注意operator[] 如何返回T&。也就是说,它返回对与key 关联的value 的引用。但是如果map 中没有key 怎么办?我们应该返回什么?没有“空引用”之类的东西,抛出异常会很烦人。

    这将是没有operator[] const 的一个很好的理由。如果您无法向map 添加任何内容(因为运营商是const),但他们正在寻找不存在的项目,您会向用户返回什么?解决这个问题的一个好办法是不要operator[] const

    【讨论】:

    • 好答案。如果 std::map 返回一个迭代器而不是 T&,那么它可能有一个 const 访问器。但我想这就是 std::map::find() 的用途。这在性能方面也会很糟糕,而且不是很直观。
    • 为什么不在 map 对象中有一个 T null_ 成员并返回对它的 const 引用?
    • @Inverse:你如何初始化null_?例如,如果 Tint 怎么办?
    【解决方案4】:

    如果密钥不存在,(非constoperator[] 会创建密钥。

    该运算符的const 版本(如果存在)必须具有不同的语义,因为它无法添加新键。

    我相信你会同意 const 和非const 的重载具有明显不同的语义将是一罐蠕虫。因此没有提供const 版本。

    虽然有一个 const find() 成员,所以您可以在代码中使用它。

    【讨论】:

      【解决方案5】:

      因为operator[]的语义是在key不存在时添加key。

      【讨论】:

        猜你喜欢
        • 2017-10-18
        • 1970-01-01
        • 1970-01-01
        • 2016-07-31
        • 2021-06-02
        • 2016-06-25
        • 2017-01-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多