c++ - 默认c - std gnu++ 11
为什么std:: map没有const访问器? (4)
(非const
) operator[]
在不存在的情况下创建该键。
该运算符的const
版本(如果存在)必须具有不同的语义,因为它不能添加新的密钥。
我相信你会同意,具有显着不同语义的const
和非const
重载将会是一堆蠕虫。 因此没有提供const
版本。
虽然有一个const find()
成员,所以你可以在你的代码中使用它。
std :: map上[]运算符的声明是这样的:
T& operator[] ( const key_type& x );
这是不是有一个原因?
T& operator[] ( const key_type& x );
const T& operator[] const ( const key_type& x );
因为无论何时您需要使用const方法访问成员映射,这都会非常有用。
从C ++ 11开始,有std::map::at
提供const和非const访问。
与operator[]
相反,如果元素不在映射中,它将抛出std::out_of_range
异常。
如果map中的operator[]
返回指定键的值, 或者为该键创建一个新的value-initialized元素(如果它尚不存在),那么这将不可能。
如果operator[]
会有一个const
超载,那么添加元素将不起作用。
这回答了这个问题。 备择方案:
对于C ++ 03 - 你可以使用迭代器(这些是const
和非const
与find
相结合)。 在C ++ 11中,您可以使用at
方法。
这些答案在那个operator[]
是正确的,如果它不存在,那么operator[]
具有添加键的语义,但我想添加另一个视角:
注意operator[]
返回一个T&
。 也就是说,它返回对与key
关联的value
的引用。 但是如果map
没有key
呢? 我们应该回报什么? 没有“空引用”这样的东西,抛出异常会很烦人。
这是没有operator[] const
一个很好的理由。 如果你不能向map
添加任何东西(因为操作符是const
),你会返回给用户什么,但是他们正在寻找一个不存在的项目? 这个问题的一个很好的解决方案是没有operator[] const
。