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


69

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

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

不是这个原因吗?

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

因为这在您每次需要以const方法访问成员映射时都会非常有用。


哇,您进入了每周堆栈交换新闻:)
xtofl 2012年

嘿,酷!Youguys有一些很好的答案,谢谢!
Calder 2012年

Answers:


80

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

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

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

对于C ++ 03-您可以使用迭代器(这些迭代器const与和不const结合使用find)。在C ++ 11中,您可以使用该at方法。


85

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

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


5
这是一个很棒的补充。
xtofl 2012年

这比编写foo.get(bar)-> second更好,谢谢!=)
Calder 2012年

6
@Calder foo.find(bar)-> second(不是“ get”)只是中断了,除非您已经知道foo带有以bar为键的条目,否则否则它将返回不可引用的迭代器...
boycy

16

这些答案是正确的,因为它operator[]具有在不存在的情况下添加键的语义,但是我想添加另一个观点:

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

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


2
好答案。如果std :: map返回一个迭代器而不是T&,则可能具有const访问器。但是我想这就是std :: map :: find()的目的。从性能角度来看,这也是不好的,不是很直观。
vobject

为什么不只T null_在map对象中有一个成员并返回对该对象的const引用?
2013年

1
@Inverse:以及如何初始化null_?例如,如果Tint什么呢?
13年

6

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

const操作符的版本(如果存在)必须具有不同的语义,因为它无法添加新的键。

我敢肯定,您会同意,具有const和不const具有明显不同语义的重载都是蠕虫病毒。因此,没有const提供任何版本。

但是有一个constfind()成员,因此您可以在代码中使用它。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.