C++ 中 unordered_map 的 at() 和 []

在 C++ 中,unordered_mapat()[] 都可以访问元素,但它们在行为上有重要区别:

  1. [] 运算符
cpp 复制代码
unordered_map<string, int> m = {{"apple", 1}};
m["apple"] = 2;     // 修改已存在的元素
m["banana"] = 3;    // 如果"banana"不存在,会创建并插入,值被值初始化(int为0)
int val = m["orange"]; // 会创建"orange"键,值为0

特点:

• 如果键不存在,会自动插入该键(值被默认构造)

• 可用于插入新元素

• 返回值的引用

• 不是 const 成员函数,不能在 const unordered_map 上使用

  1. at() 方法
cpp 复制代码
unordered_map<string, int> m = {{"apple", 1}};
int val1 = m.at("apple");  // 正常访问,返回1
int val2 = m.at("banana"); // 抛出 std::out_of_range 异常

特点:

• 如果键不存在,抛出 std::out_of_range 异常

• 不会插入新元素

• 有 const 版本,可以在 const unordered_map 上使用

• 更加安全,能避免意外插入

  1. 关键区别对比
特性 operator [] at()
键不存在时 插入新键值对 抛出异常
可否用于插入
异常安全性 不抛异常 std::out_of_range
const 版本
返回类型 引用 引用(const 或非 const
  1. 使用建议
cpp 复制代码
// 推荐做法:
unordered_map<string, int> m;

// 检查键是否存在再访问
if (m.find("key") != m.end()) {
    int val = m["key"];  // 或 m.at("key")
}

// 使用 at() 进行安全访问
try {
    int val = m.at("key");
} catch (const std::out_of_range& e) {
    // 处理键不存在的情况
}

// 使用 [] 进行插入或修改
m["new_key"] = 10;  // 直接插入

// 遍历访问(安全)
for (const auto& [key, value] : m) {
    // 安全访问,不会插入新元素
}
  1. 总结

• 想检查键是否存在时:用 find()contains() (C++20)

• 确保键存在时:用 at() 更安全

• 想插入或修改时:用 []

• 访问 const map 时:只能用 at() 或迭代器

相关推荐
Darling噜啦啦2 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
clint4562 天前
C++进阶(1)——前景提要
c++
夜悊3 天前
C++代码示例:进制数简单生成工具
c++
郝学胜_神的一滴3 天前
CMake 021: IF 条件判据详诠
c++·cmake
_wyt0013 天前
洛谷 B3930 [GESP202312 五级] 烹饪问题 题解
c++·gesp
小小工匠3 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾3 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
один but you3 天前
constexpr函数
c++
Qres8213 天前
算法复键——树状数组
数据结构·算法
凡人叶枫3 天前
Effective C++ 条款41:了解隐式接口和编译期多态
java·开发语言·c++·effective c++