首页 文章

为什么std :: map没有const访问器?

提问于
浏览
67

std :: map上[]运算符的声明是这样的:

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

有没有理由不是这个?

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

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

5 回答

  • 79

    这些答案是正确的,因为 operator[] 具有添加密钥的语义,如果它不想添加另一个透视图:

    注意 operator[] 如何返回 T& . 也就是说,它返回与 key 关联的 value 的引用 . 但是如果 map 中没有 key 怎么办?我们该怎么回事?没有"null-reference,"这样的东西,扔一个异常会很烦人 .

    这是没有 operator[] const 的一个很好的理由 . 如果您无法向 map 添加任何内容(因为运算符为 const ),您将返回给用户,但他们正在寻找不存在的项目?这个问题的一个很好的解决方案是没有 operator[] const .

  • 16

    Map 中的 operator[] 返回指定键的值 or 为该键创建一个新的值初始化元素(如果它尚未存在),因此这是不可能的 .

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

    这回答了这个问题 . 备择方案:

    对于 C++03 - 您可以使用迭代器(这些是 const 和非 constfind 耦合) . 在 C++11 中,您可以使用 at 方法 .

  • 6

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

    operator[] 相比,如果元素不在 Map 中,它将抛出 std::out_of_range 异常 .

  • 4

    如果密钥不存在,则(非 constoperator[] 创建密钥 .

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

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

    但是有一个const find() 成员,所以你可以在你的代码中使用它 .

  • 84

    因为 operator[] 的语义是添加密钥,如果它不存在 .

相关问题