1.60、map取值的 find,[],at方法的区别?
1. find() 方法
- • 功能:查找指定键是否存在,返回一个迭代器指向该元素;如果不存在,返回
map::end()
迭代器。 - • 特点:
- • 不会修改容器,不会插入新元素。
- • 适合只读查找,且需要判断元素是否存在的场景。
- • 返回的是迭代器,可以通过迭代器访问键值对。
- • 使用示例:
auto it = mymap.find(key);
if (it != mymap.end()) {
// 找到,访问 it->second
} else {
// 未找到
}
- • 总结:安全、无副作用,适合判断和访问。
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】公众号,未经授权,不得转载。
(加入我的知识星球,免费获取账号,解锁所有文章。)
阅读剩余
版权声明:
作者:讳疾忌医-note
链接:https://www.1217zy.vip/archives/1399
文章版权归作者所有,未经允许请勿转载。
THE END