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

tjvv9vkg  于 12个月前  发布在  其他
关注(0)|答案(5)|浏览(141)

std::map上的[]操作符的声明如下:

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

字符串
有什么理由不是这样吗?

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


因为这将是非常有用的任何时候你需要访问一个成员Map在一个常量方法。

u2nhd7ah

u2nhd7ah1#

map中的operator[]返回指定键处的值,或者为该键创建一个新的值初始化元素(如果它还不存在),所以这是不可能的。
如果operator[]有一个const重载,添加元素将不起作用。
这就回答了问题。备选方案:
对于C++03-你可以使用迭代器(这些是const和非constfind耦合)。在C++11中你可以使用at方法。

rbl8hiat

rbl8hiat2#

这些答案是正确的,因为operator[]具有在键不存在时添加键的语义,但我想添加另一个视角:
注意operator[]如何返回T&。也就是说,它返回与key关联的value的引用。但是如果map中没有key呢?我们应该返回什么?没有“空引用”这样的东西,抛出异常会很烦人。
这是不使用operator[] const的一个很好的理由。如果您无法向map添加任何内容(因为操作符是const),但用户正在查找不存在的项目,那么您将向用户返回什么?解决此问题的一个很好的解决方案是不使用operator[] const

brc7rcf0

brc7rcf03#

(非constoperator[]在键不存在时创建键。
该操作符的const版本(如果存在)必须具有不同的语义,因为它不能添加新键。
我相信你会同意,const和非const重载具有显著不同的语义将是一个蠕虫罐。因此没有const版本提供。
不过有一个const find()成员,所以你可以在代码中使用它。

mi7gmzs6

mi7gmzs64#

因为operator[]的语义是如果键不存在就添加它。

qxgroojn

qxgroojn5#

从C++11开始,std::map::at提供了const和non-const访问。
operator[]相反,如果元素不在map中,它将抛出std::out_of_range异常。

相关问题