std::map上的[]运算符的声明如下:
T& operator[] ( const key_type& x );
有什么原因不是这样的吗?
T& operator[] ( const key_type& x );
const T& operator[] const ( const key_type& x );
因为当您需要访问const方法中的成员映射时,这将是非常有用的。
发布于 2012-12-16 23:35:43
从C++11开始,有了std::map::at
,它提供常量和非常量访问。
与operator[]
相比,如果元素不在映射中,它将抛出std::out_of_range
异常。
发布于 2012-12-16 23:36:50
这些答案是正确的,因为operator[]
具有在键不存在时添加键的语义,但我想添加另一个观点:
注意operator[]
是如何返回一个T&
的。也就是说,它返回对与key
关联的value
的引用。但是如果map
中没有key
呢?我们应该返回什么?没有“空引用”这回事,抛出异常会很烦人。
这将是不使用operator[] const
的一个很好的理由。如果您不能向map
添加任何内容(因为运算符是const
),但是用户正在查找一个不存在的项,那么您将向用户返回什么?这个问题的一个很好的解决方案是不使用operator[] const
。
发布于 2012-12-16 23:28:14
如果密钥不存在,(非const
) operator[]
将创建该密钥。
该操作符const
版本(如果存在)必须具有不同的语义,因为它不能添加新键。
我相信你会同意,让const
和非const
重载具有明显不同的语义将是一堆蠕虫。因此,没有提供const
版本。
不过,有一个const find()
成员,所以您可以在代码中使用它。
https://stackoverflow.com/questions/13902742
复制相似问题