为什么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
和非const
与find
相结合)。 在C ++ 11中,你可以使用at
方法。
从C ++ 11开始,有std::map::at
提供const和非const访问。
与operator[]
相反,如果元素不在映射中,则会抛出std::out_of_range
exception。
这些答案是正确的在那个operator[]
有语义添加一个关键,如果它不存在,但我想添加另一个angular度:
注意operator[]
返回一个T&
。 也就是说,它返回对与key
关联的value
的引用。 但是如果map
没有key
呢? 我们应该回报什么? 没有“空引用”这样的东西,抛出一个exception会很烦人。
这将是没有operator[] const
一个很好的理由。 如果你不能向map
添加任何东西(因为操作符是const
),你会返回给用户,但是他们正在寻找一个不存在的东西? 这个问题的一个很好的解决scheme是没有operator[] const
。
(非const
) operator[]
创build该键如果不存在。
该运算符的const
版本(如果存在)将不得不具有不同的语义,因为它不能添加新的键。
我相信你会同意,具有明显不同的语义的const
和非const
重载将会是一堆蠕虫。 因此没有提供const
版本。
有一个const find()
成员,所以你可以在你的代码中使用它。
因为operator[]
的语义是添encryption钥,如果它不存在。