C++ 为什么std::map没有常量访问器?

C++ 为什么std::map没有常量访问器?,c++,c++11,std,C++,C++11,Std,std::map上[]运算符的声明如下: T& operator[] ( const key_type& x ); 这不是为什么 T& operator[] ( const key_type& x ); const T& operator[] const ( const key_type& x ); 因为当您需要在const方法中访问成员映射时,这将非常有用。因为操作符[]的语义是在键不存在时添加键。操作符[]在映射中返回指定键处的值或为该键创

std::map上[]运算符的声明如下:

T& operator[] ( const key_type& x );
这不是为什么

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

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

因为
操作符[]
的语义是在键不存在时添加键。

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

如果
operator[]
将有
const
重载,则添加元素将不起作用

这就回答了问题。备选方案:

对于C++03,可以使用迭代器(迭代器是
const
和非
const
以及
find
)。在C++11中,可以使用
at
方法。

如果键不存在,(非
常量
操作符[]
将创建该键

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

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


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

从C++11开始,有一个
std::map::at
提供常量和非常量访问


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

这些答案是正确的,因为
operator[]
具有在键不存在时添加键的语义,但我想添加另一个透视图:

注意
操作符[]
如何返回
T&
。也就是说,它返回与
键关联的
值的引用。但是如果
地图中没有
,该怎么办?我们应该返回什么?没有“空引用”这样的东西,抛出异常会很烦人


这是不使用
运算符[]const
的一个很好的理由。如果您无法将任何内容添加到
映射
(因为操作员是
const
),但他们正在查找不存在的项目,您会向用户返回什么?解决这个问题的一个好办法是不使用
操作符[]const

,这是一个很好的补充。这比编写foo.get(bar)->好得多,谢谢!=)@Calder foo.find(bar)->second(不是“get”)刚刚被破坏,除非您已经知道foo有一个以bar为键的条目,否则它将返回一个不可解引用的迭代器……这是一个很好的答案。如果std::map返回一个迭代器而不是T&,那么它可能有一个const访问器。但我想这就是std::map::find()的用途。这在性能方面也很糟糕,而且不是很直观。为什么不在映射对象中有一个
T null
成员并返回对该成员的常量引用?@Inverse:那么如何初始化
null
?例如,如果
T
int
?哇,你上了每周堆栈交换通讯:)嘿嘿,酷!你们有一些很好的答案,谢谢!