1.60、map取值的 find,[],at方法的区别?

1. find() 方法

  • • 功能:查找指定键是否存在,返回一个迭代器指向该元素;如果不存在,返回map::end()迭代器。
  • • 特点
    • • 不会修改容器,不会插入新元素。
    • • 适合只读查找,且需要判断元素是否存在的场景。
    • • 返回的是迭代器,可以通过迭代器访问键值对。
  • • 使用示例
auto it = mymap.find(key);
if (it != mymap.end()) {
    // 找到,访问 it->secondelse {
    // 未找到
}
  • • 总结:安全、无副作用,适合判断和访问。

2. operator[]([])

  • • 功能:通过键访问对应的值,如果键不存在,会自动插入一个该键对应的默认值(即值类型的默认构造)。
  • • 特点
    • • 既可用于访问,也可用于修改或插入元素。
    • • 不能用于const对象,因为它可能修改容器。
    • • 使用时要注意:访问不存在的键会导致容器大小增加,且值被默认初始化,可能带来性能或逻辑上的副作用。
  • • 使用示例
mymap[key] = value; // 插入或修改
auto val = mymap[key]; // 如果key不存在,会插入默认值
  • • 总结:方便快捷,适合插入或修改,但不适合只读访问。

3. at() 方法

  • • 功能:访问指定键对应的值,如果键不存在,会抛出std::out_of_range异常。
  • • 特点
    • • 不会插入新元素,保证容器不被修改。
    • • 支持const对象访问。
    • • 访问越界时抛异常,适合需要严格边界检查的场景。
  • • 使用示例
try {
    auto val = mymap.at(key);
} catch (const std::out_of_range& e) {
    // 处理键不存在的情况
}
  • • 总结:安全且严格,适合需要异常处理的访问。

总结对比表

特性 find() operator[] ([]) at()
是否插入新元素 是(默认构造值)
是否抛异常 是(键不存在时抛out_of_range)
返回类型 迭代器 值的引用 值的引用
是否支持const 是(返回const_iterator)
适用场景 查找并判断是否存在 插入或修改元素 只读访问且需严格边界检查

面试考察重点

  • • 理解副作用[]会插入元素,可能导致意料之外的容器增长,面试官会关注你是否意识到这一点。
  • • 异常安全at()抛异常,是否能正确捕获和处理异常体现代码健壮性。
  • • 性能考虑find()返回迭代器,避免不必要的插入,适合高效查找。
  • • const兼容性at()find()支持const访问,[]不支持,体现对容器访问权限的理解。
    本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
    (加入我的知识星球,免费获取账号,解锁所有文章。)

 

阅读剩余
THE END