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

Cal*_*der 67 c++ std c++11

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

T& operator[] ( const key_type& x );
Run Code Online (Sandbox Code Playgroud)

有没有理由不是这个?

T& operator[] ( const key_type& x );
const T& operator[] const ( const key_type& x );
Run Code Online (Sandbox Code Playgroud)

因为只要您需要在const方法中访问成员映射,这将非常有用.

inf*_*inf 84

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

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

  • @Calder foo.find(bar) - > second(不是'get')刚刚被破坏,除非你已经知道foo有一个带条作为键的条目,否则它会返回一个不可解引用的迭代器... (6认同)
  • _这是一个很好的补充. (5认同)

Luc*_*ore 80

operator[]在map中返回指定键的值,或者为该键创建一个新的value-initialized元素(如果它尚未存在),因此这是不可能的.

如果operator[]const重载,添加元素将无法正常工作.

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

对于C++ 03 - 您可以使用迭代器(这些const是非const耦合的find).在C++ 11中,您可以使用该at方法.


Cor*_*lks 16

这些答案是正确的,因为它operator[]具有添加密钥的语义(如果它不存在),但我想添加另一个透视图:

注意如何operator[]返回a T&.也就是说,它返回value与之关联的引用key.但是,如果有什么不keymap?我们该怎么回事?没有"null-reference"这样的东西,抛出异常会很烦人.

这是否是一个很好的理由operator[] const.如果您无法向map(或因为运营商const)添加任何内容,您会向用户返回什么,但他们正在寻找不存在的项目?这个问题的一个很好的解决方案是没有operator[] const.

  • 好答案.也许std :: map可以有一个const访问器,如果它返回一个迭代器而不是T&.但我想这就是std :: map :: find()的用途.它也会在性能方面表现不佳而且不太直观. (2认同)

NPE*_*NPE 6

如果密钥不存在,则(非const)operator[]创建密钥.

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

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

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