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

时间:2012-12-16 15:25:52

标签: c++ c++11 std

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

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

这有什么原因吗?

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

因为只要你需要在const方法中访问成员映射,这将是非常有用的。

5 个答案:

答案 0 :(得分:84)

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

operator[]相反,如果元素不在地图中,它将抛出std::out_of_range异常。

答案 1 :(得分:79)

地图中的

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

如果operator[]过载const,则添加该元素将无效。

这回答了这个问题。备选方案:

对于 C ++ 03 - 您可以使用迭代器(const和非constfind)。在 C ++ 11 中,您可以使用at方法。

答案 2 :(得分:16)

这些答案是正确的,因为operator[]具有添加密钥的语义(如果它不存在),但我想添加另一个视角:

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

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

答案 3 :(得分:6)

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

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

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

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

答案 4 :(得分:4)

因为operator[]的语义是在不存在的情况下添加密钥。