c++ - 当我应该使用 std::map::at 来检索 map 元素时

标签 c++ c++11 stdmap

我在 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,否则你应该考虑异常处理。

  1. 在任何情况下 std::map::at 被认为是最有效和最优雅的方式吗?在什么情况下你会推荐使用 std::map::at
  2. 当有可能没有带有这样一个键的元素时,最好使用 map::find() 是对的吗?而 map::find() 是更快更优雅的方法吗?
if ( map.find("key") != map.end() )
{
    // found 

} else
{
    // not found
}

附言

map::operator[] 有时可能很危险,因为如果一个元素不存在,那么它将插入它。

已编辑:链接以某种方式相关link 1 link 2 link 3 link 4 link 5 link 6

最佳答案

与此处的大多数现有答案相反,请注意实际上有 4 种方法与在 map 中查找元素相关(忽略 lower_boundupper_boundequal_range,不太精确):

  • operator[] 仅存在于非常量版本中,如前所述,如果元素不存在,它将创建元素
  • at(),在 C++11 中引入,如果元素存在则返回对元素的引用,否则抛出异常
  • find() 如果元素存在则返回一个迭代器,如果不存在则返回一个迭代器到map::end()
  • count() 返回此类元素的数量,在 map 中,这是 0 或 1

现在语义已经很清楚了,让我们回顾一下何时使用 which:

  • 如果您只想知道 map 中是否存在某个元素(或不存在),请使用 count()
  • 如果你想访问元素,它应该在 map 中,然后使用 at()
  • 如果你想访问元素,不知道它是否在map中,那么使用find();不要忘记检查生成的迭代器是否不等于 end() 的结果。
  • 最后,如果您希望访问该元素(如果存在)或创建(并访问)它(如果不存在),请使用 operator[];如果您不希望调用类型默认构造函数来创建它,请适本地使用 insertemplace

关于c++ - 当我应该使用 std::map::at 来检索 map 元素时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33236038/

相关文章:

c++ - 为什么我不能将 std::begin/std::end 与 int(*p)[3] 一起使用,而我可以与 int(&p)[3] 一起使用?

c++ - 直接将子句添加到 z3 求解器

c++ - 如何在kali linux的make命令中启用c++11

c++ - map.find() 看似随机返回 map.end()

c++ - 想评估两个 sockaddr_in 结构之间的比较

c++ - Opencv - 找不到头文件

c++ - 使用 C++11 lambda 函数将点击事件连接到函数时出现问题

c++ - 操作数的评估顺序

C++,std::map 的迭代器

c++ - 将 STL 容器用于 boost::interprocess::managed_shared_memory