我在 stackoverflow 上阅读了不同的网络文章和问题。 ,但对我来说,不清楚是否有任何排他性的情况下最好使用 std::map::at
来检索 map 元素。
根据definition , std::map::at
Returns a reference to the mapped value of the element identified with key k.
If k does not match the key of any element in the container, the function throws an out_of_range exception.
对我来说,只有当你 100% 确定具有特定键的元素存在时才值得使用 std::map::at
,否则你应该考虑异常处理。
- 在任何情况下
std::map::at
被认为是最有效和最优雅的方式吗?在什么情况下你会推荐使用std::map::at
? - 当有可能没有带有这样一个键的元素时,最好使用
map::find()
是对的吗?而map::find()
是更快更优雅的方法吗?
if ( map.find("key") != map.end() ) { // found } else { // not found }
附言
map::operator[]
有时可能很危险,因为如果一个元素不存在,那么它将插入它。
最佳答案
与此处的大多数现有答案相反,请注意实际上有 4 种方法与在 map 中查找元素相关(忽略 lower_bound
、upper_bound
和 equal_range
,不太精确):
operator[]
仅存在于非常量版本中,如前所述,如果元素不存在,它将创建元素at()
,在 C++11 中引入,如果元素存在则返回对元素的引用,否则抛出异常find()
如果元素存在则返回一个迭代器,如果不存在则返回一个迭代器到map::end()
count()
返回此类元素的数量,在map
中,这是 0 或 1
现在语义已经很清楚了,让我们回顾一下何时使用 which:
- 如果您只想知道
map
中是否存在某个元素(或不存在),请使用count()
。 - 如果你想访问元素,它应该在
map
中,然后使用at()
。 - 如果你想访问元素,不知道它是否在
map
中,那么使用find()
;不要忘记检查生成的迭代器是否不等于end()
的结果。 - 最后,如果您希望访问该元素(如果存在)或创建(并访问)它(如果不存在),请使用
operator[]
;如果您不希望调用类型默认构造函数来创建它,请适本地使用insert
或emplace
关于c++ - 当我应该使用 std::map::at 来检索 map 元素时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33236038/