在面试流程(例如筛选)的早期阶段,一位 Google 招聘人员曾向我问过这个问题。
在C++中,当你使用std::map访问一个不存在的键时,行为取决于你是如何访问它的。
使用下标操作符 [] 访问时
如果键不存在,std::map 会默认插入一个该键的元素,并为其赋值为类型的默认值。比如,如果 map 的值类型是 int,那么它会插入该键并赋值为 0。
例子:
1 2 | std::map<int, int> myMap; int value = myMap[10]; // 如果键10不存在,会插入myMap[10] = 0 |
std::map<int, int> myMap; int value = myMap[10]; // 如果键10不存在,会插入myMap[10] = 0
使用 at() 方法访问时
如果键不存在,at() 会抛出 std::out_of_range 异常。
例子:
1 2 3 4 5 6 | std::map<int, int> myMap; try { int value = myMap.at(10); // 如果键10不存在,会抛出异常 } catch (const std::out_of_range& e) { std::cout << "Key not found!" << std::endl; } |
std::map<int, int> myMap; try { int value = myMap.at(10); // 如果键10不存在,会抛出异常 } catch (const std::out_of_range& e) { std::cout << "Key not found!" << std::endl; }
使用 find() 方法
find() 方法不会修改 map,它返回一个迭代器。如果键不存在,它会返回 map.end()。
例子:
1 2 3 4 5 6 7 | std::map<int, int> myMap; auto it = myMap.find(10); if (it == myMap.end()) { std::cout << "Key not found!" << std::endl; } else { std::cout << "Value: " << it->second << std::endl; } |
std::map<int, int> myMap; auto it = myMap.find(10); if (it == myMap.end()) { std::cout << "Key not found!" << std::endl; } else { std::cout << "Value: " << it->second << std::endl; }
C++ std::map 和 std::unordered_map的比较
std::unordered_map 处理不存在的键与 std::map 类似,但有一些差异,主要是因为它们内部的数据结构不同。
map 和 unordered_map 的区别:
- 顺序:std::map 是有序的(内部实现为平衡树),所以元素会按键的顺序排列。而 std::unordered_map 是无序的,使用哈希表存储元素,因此没有特定的顺序。
- 性能:std::unordered_map 通常有更快的平均访问时间(由于哈希结构,平均时间复杂度为 O(1)),而 std::map 的访问时间复杂度为 O(log n),因为其内部实现为树结构。然而,如果发生大量哈希冲突,unordered_map 在最坏情况下的时间复杂度可能是 O(n)。
总的来说,std::unordered_map 和 std::map 在处理不存在的键时,对于 []、at() 和 find() 的行为相似,但它们在顺序和性能方面存在差异。
总结
- 使用 [] 访问时,如果键不存在,map 会插入一个新元素并赋予默认值。
- 使用 at() 访问时,如果键不存在,会抛出异常。
- 使用 find() 可以检查键是否存在,而不会修改 map。
英文:C++: Access a Non-existent Key in std::map or std::unordered_map
面试经历
- 写了十几年代码, 谷歌/Google认为我还不够Senior
- Jane Street第一轮一小时面试体验卡(伦敦软件工程师)
- Meta/Facebook四次面试经历
- 三次冲击谷歌软件工程师: 我的面试起伏录 (谷歌面试是不是一生只有三次机会?)
- 记两次伦敦抖音面试经历(Tiktok)
- 我的面试谷哥GOOGLE伦敦SRE的经验和教训
- 记Facebook的第一轮技术面试(伦敦脸书)
- 记微软Principal SE的第一轮面试
- 我的AMAZON面试经历与经验之谈(亚麻伦敦面经)
- 离伦敦脸书最近的一次 - 记FACEBOOK伦敦终面经历
面试题
- 软件工程师面试: TCP/IP协议是什么?
- 软件工程师经典面试题: 当你在浏览器的地址栏敲入google.com并按回车后发生了什么?
- 谷歌面试题: 迷宫随机生成算法
- 软件工程师数据库面试技巧之 SQL中的第二名记录
- 软件工程师面试技巧之 动态规化 - 整数拆分
- 软件工程师面试技巧之 如何检查数独的有效性
- 去年 Google 的面试题 - 打印消息
- 软件工程师面试技巧之 使用哈希表降复杂度
- 微软面试题: 三角形的面积是多少?
- 英国 IT公司 电话面试的一些技巧 (程序员)
- C/C++ 中的内存管理器(堆与栈)
- C++的 map 当键(Key)不存在的时候会发生什么?
- 随机数独游戏的算法设计 (Sudoku)
- 经典二叉树的镜像的递归算法
- 谷歌的扔鸡蛋问题
- 面经: Python 的 List 和 Dictionary 有啥区别?
- 逻辑测试系列 - 一种只有4种语句的编程语言 - (1)
- 逻辑测试系列之二 - DECR
- 逻辑测试系列之三 - SUBT
面试技巧
面试其它
- 产品设计和系统设计面的区别(Product Design vs System Design)
- 45 分钟模拟面试(编程、系统设计)+职业发展建议
- 英国和美国IT公司面试的主要区别
- 拒了甲骨文(Oracle)的 Offer
强烈推荐
- 英国代购-畅购英伦
- TopCashBack 返现 (英国购物必备, 积少成多, 我2年来一共得了3000多英镑)
- Quidco 返现 (也是很不错的英国返现网站, 返现率高)
- 注册就送10美元, 免费使用2个月的 DigitalOcean 云主机(性价比超高, 每月只需5美元)
- 注册就送10美元, 免费使用4个月的 Vultr 云主机(性价比超高, 每月只需2.5美元)
- 注册就送10美元, 免费使用2个月的 阿里 云主机(性价比超高, 每月只需4.5美元)
- 注册就送20美元, 免费使用4个月的 Linode 云主机(性价比超高, 每月只需5美元) (折扣码: PodCastInit2022)
- PlusNet 英国光纤(超快, 超划算! 用户名 doctorlai)
- 刷了美国运通信用卡一年得到的积分 换了 485英镑
- 注册就送50英镑 – 英国最便宜最划算的电气提供商
- 能把比特币莱特币变现的银行卡! 不需要手续费就可以把虚拟货币法币兑换
微信公众号: 小赖子的英国生活和资讯 JustYYUK