std :: map上[]运算符的声明是这样的:
T& operator[] ( const key_type& x );
有没有理由不是这个?
T& operator[] ( const key_type& x ); const T& operator[] const ( const key_type& x );
因为只要您需要在const方法中访问成员映射,这将非常有用 .
这些答案是正确的,因为 operator[] 具有添加密钥的语义,如果它不想添加另一个透视图:
operator[]
注意 operator[] 如何返回 T& . 也就是说,它返回与 key 关联的 value 的引用 . 但是如果 map 中没有 key 怎么办?我们该怎么回事?没有"null-reference,"这样的东西,扔一个异常会很烦人 .
T&
key
value
map
这是没有 operator[] const 的一个很好的理由 . 如果您无法向 map 添加任何内容(因为运算符为 const ),您将返回给用户,但他们正在寻找不存在的项目?这个问题的一个很好的解决方案是没有 operator[] const .
operator[] const
const
Map 中的 operator[] 返回指定键的值 or 为该键创建一个新的值初始化元素(如果它尚未存在),因此这是不可能的 .
如果 operator[] 将具有 const 重载,则添加该元素将不起作用 .
这回答了这个问题 . 备择方案:
对于 C++03 - 您可以使用迭代器(这些是 const 和非 const 与 find 耦合) . 在 C++11 中,您可以使用 at 方法 .
find
at
从C 11开始, std::map::at 提供了const和非const访问 .
std::map::at
与 operator[] 相比,如果元素不在 Map 中,它将抛出 std::out_of_range 异常 .
std::out_of_range
如果密钥不存在,则(非 const ) operator[] 创建密钥 .
该运算符的 const 版本(如果存在)必须具有不同的语义,因为它无法添加新键 .
我相信你会同意,具有明显不同语义的 const 和非 const 重载将是一堆蠕虫 . 因此,不提供 const 版本 .
但是有一个const find() 成员,所以你可以在你的代码中使用它 .
find()
因为 operator[] 的语义是添加密钥,如果它不存在 .
5 回答
这些答案是正确的,因为
operator[]
具有添加密钥的语义,如果它不想添加另一个透视图:注意
operator[]
如何返回T&
. 也就是说,它返回与key
关联的value
的引用 . 但是如果map
中没有key
怎么办?我们该怎么回事?没有"null-reference,"这样的东西,扔一个异常会很烦人 .这是没有
operator[] const
的一个很好的理由 . 如果您无法向map
添加任何内容(因为运算符为const
),您将返回给用户,但他们正在寻找不存在的项目?这个问题的一个很好的解决方案是没有operator[] const
.Map 中的
operator[]
返回指定键的值 or 为该键创建一个新的值初始化元素(如果它尚未存在),因此这是不可能的 .如果
operator[]
将具有const
重载,则添加该元素将不起作用 .这回答了这个问题 . 备择方案:
对于 C++03 - 您可以使用迭代器(这些是
const
和非const
与find
耦合) . 在 C++11 中,您可以使用at
方法 .从C 11开始,
std::map::at
提供了const和非const访问 .与
operator[]
相比,如果元素不在 Map 中,它将抛出std::out_of_range
异常 .如果密钥不存在,则(非
const
)operator[]
创建密钥 .该运算符的
const
版本(如果存在)必须具有不同的语义,因为它无法添加新键 .我相信你会同意,具有明显不同语义的
const
和非const
重载将是一堆蠕虫 . 因此,不提供const
版本 .但是有一个const
find()
成员,所以你可以在你的代码中使用它 .因为
operator[]
的语义是添加密钥,如果它不存在 .