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

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

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

有没有这个原因呢?

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

因为任何时候你需要访问const方法中的成员映射,这都会非常有用。

如果map中的operator[]返回指定键的值, 或者为该键创build了一个新的value-initialized元素(如果它尚不存在的话),所以这是不可能的。

如果operator[]会有一个const超载,那么添加元素将不起作用。

这回答了这个问题。 备择scheme:

对于C ++ 03 – 你可以使用迭代器(这些是const和非constfind相结合)。 在C ++ 11中,你可以使用at方法。

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

operator[]相反,如果元素不在映射中,则会抛出std::out_of_rangeexception。

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

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

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

(非constoperator[]创build该键如果不存在。

该运算符的const版本(如果存在)将不得不具有不同的语义,因为它不能添加新的键。

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

有一个const find()成员,所以你可以在你的代码中使用它。

因为operator[]的语义是添encryption钥,如果它不存在。