std::map上的[]操作符的声明如下:
T& operator[] ( const key_type& x );
字符串有什么理由不是这样吗?
T& operator[] ( const key_type& x ); const T& operator[] const ( const key_type& x );
型因为这将是非常有用的任何时候你需要访问一个成员Map在一个常量方法。
u2nhd7ah1#
map中的operator[]返回指定键处的值,或者为该键创建一个新的值初始化元素(如果它还不存在),所以这是不可能的。如果operator[]有一个const重载,添加元素将不起作用。这就回答了问题。备选方案:对于C++03-你可以使用迭代器(这些是const和非const与find耦合)。在C++11中你可以使用at方法。
operator[]
const
find
at
rbl8hiat2#
这些答案是正确的,因为operator[]具有在键不存在时添加键的语义,但我想添加另一个视角:注意operator[]如何返回T&。也就是说,它返回与key关联的value的引用。但是如果map中没有key呢?我们应该返回什么?没有“空引用”这样的东西,抛出异常会很烦人。这是不使用operator[] const的一个很好的理由。如果您无法向map添加任何内容(因为操作符是const),但用户正在查找不存在的项目,那么您将向用户返回什么?解决此问题的一个很好的解决方案是不使用operator[] const。
T&
key
value
map
operator[] const
brc7rcf03#
(非const)operator[]在键不存在时创建键。该操作符的const版本(如果存在)必须具有不同的语义,因为它不能添加新键。我相信你会同意,const和非const重载具有显著不同的语义将是一个蠕虫罐。因此没有const版本提供。不过有一个const find()成员,所以你可以在代码中使用它。
find()
mi7gmzs64#
因为operator[]的语义是如果键不存在就添加它。
qxgroojn5#
从C++11开始,std::map::at提供了const和non-const访问。与operator[]相反,如果元素不在map中,它将抛出std::out_of_range异常。
std::map::at
std::out_of_range
5条答案
按热度按时间u2nhd7ah1#
map中的
operator[]
返回指定键处的值,或者为该键创建一个新的值初始化元素(如果它还不存在),所以这是不可能的。如果
operator[]
有一个const
重载,添加元素将不起作用。这就回答了问题。备选方案:
对于C++03-你可以使用迭代器(这些是
const
和非const
与find
耦合)。在C++11中你可以使用at
方法。rbl8hiat2#
这些答案是正确的,因为
operator[]
具有在键不存在时添加键的语义,但我想添加另一个视角:注意
operator[]
如何返回T&
。也就是说,它返回与key
关联的value
的引用。但是如果map
中没有key
呢?我们应该返回什么?没有“空引用”这样的东西,抛出异常会很烦人。这是不使用
operator[] const
的一个很好的理由。如果您无法向map
添加任何内容(因为操作符是const
),但用户正在查找不存在的项目,那么您将向用户返回什么?解决此问题的一个很好的解决方案是不使用operator[] const
。brc7rcf03#
(非
const
)operator[]
在键不存在时创建键。该操作符的
const
版本(如果存在)必须具有不同的语义,因为它不能添加新键。我相信你会同意,
const
和非const
重载具有显著不同的语义将是一个蠕虫罐。因此没有const
版本提供。不过有一个const
find()
成员,所以你可以在代码中使用它。mi7gmzs64#
因为
operator[]
的语义是如果键不存在就添加它。qxgroojn5#
从C++11开始,
std::map::at
提供了const和non-const访问。与
operator[]
相反,如果元素不在map中,它将抛出std::out_of_range
异常。