c++ - 默认c - std gnu++ 11




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

(非constoperator[]在不存在的情况下创建该键。

该运算符的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和非constfind相结合)。 在C ++ 11中,您可以使用at方法。


这些答案在那个operator[]是正确的,如果它不存在,那么operator[]具有添加键的语义,但我想添加另一个视角:

注意operator[]返回一个T& 。 也就是说,它返回对与key关联的value的引用。 但是如果map没有key呢? 我们应该回报什么? 没有“空引用”这样的东西,抛出异常会很烦人。

这是没有operator[] const一个很好的理由。 如果你不能向map添加任何东西(因为操作符是const ),你会返回给用户什么,但是他们正在寻找一个不存在的项目? 这个问题的一个很好的解决方案是没有operator[] const





std