std :: map上[]运算符的声明是:
T& operator[] ( const key_type& x );
这有什么原因吗?
T& operator[] ( const key_type& x );
const T& operator[] const ( const key_type& x );
因为只要你需要在const方法中访问成员映射,这将是非常有用的。
答案 0 :(得分:84)
从C ++ 11开始,std::map::at
提供了const和非const访问。
与operator[]
相反,如果元素不在地图中,它将抛出std::out_of_range
异常。
答案 1 :(得分:79)
operator[]
返回指定键的值或为该键创建一个新的值初始化元素(如果它尚未存在),因此这是不可能的。
如果operator[]
过载const
,则添加该元素将无效。
这回答了这个问题。备选方案:
对于 C ++ 03 - 您可以使用迭代器(const
和非const
加find
)。在 C ++ 11 中,您可以使用at
方法。
答案 2 :(得分:16)
这些答案是正确的,因为operator[]
具有添加密钥的语义(如果它不存在),但我想添加另一个视角:
注意operator[]
如何返回T&
。也就是说,它返回与value
相关联的key
的引用。但是如果key
中没有map
怎么办?我们该怎么回事?没有“空引用”这样的东西,抛出异常会很烦人。
这是没有operator[] const
的一个很好的理由。如果您无法向map
添加任何内容(因为运算符为const
),您会向用户返回什么,但他们正在寻找不存在的项目?这个问题的一个很好的解决方案是没有operator[] const
。
答案 3 :(得分:6)
(非const
)operator[]
会创建密钥(如果密钥不存在)。
该运算符的const
版本(如果存在)必须具有不同的语义,因为它无法添加新密钥。
我相信你会同意,const
和非const
重载具有明显不同的语义将成为一种蠕虫。因此,不提供const
版本。
虽然有一个const find()
成员,但您可以在代码中使用它。
答案 4 :(得分:4)
因为operator[]
的语义是在不存在的情况下添加密钥。