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() 或迭代器

相关推荐
NiceCloud喜云6 小时前
Opus 4.8 的 Effort Control 怎么选:Low 到 Max 五档策略
android·java·大数据·前端·c++·python·spring
cjhbachelor6 小时前
c++继承
c++
肩上风骋7 小时前
C++14特性
开发语言·c++·c++14特性
_日拱一卒7 小时前
LeetCode:994腐烂的橘子
java·数据结构·算法·leetcode·深度优先
2401_868534789 小时前
【无标题】
数据结构·r语言
Mr. zhihao9 小时前
Redis五大高级数据结构:原理-场景-底层-横向对比
数据结构·redis
QiLinkOS10 小时前
【从实验室到商业战场:发明专利如何重塑科技与企业的共生生态】
大数据·c语言·数据结构·c++·人工智能·单片机·算法
如此这般英俊10 小时前
手撕Claude Code—第一章 agent-loop
数据结构·人工智能·语言模型·自然语言处理
Irissgwe10 小时前
c++11(lambda表达式与包装器、线程库)
c++·c++11·lambda表达式·线程库·包装器·互斥量库·条件变量库
Peter·Pan爱编程11 小时前
14. Lambda 表达式:随手可写的函数对象
c++·算法·ai编程