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

相关推荐
漫随流水32 分钟前
leetcode算法(111.二叉树的最小深度)
数据结构·算法·leetcode·二叉树
fpcc35 分钟前
跟我学C++中级篇——Linux中文件和链接及重定向
linux·c++
Fcy6482 小时前
C++ set&&map的模拟实现
开发语言·c++·stl
fpcc9 小时前
C++编程实践——链式调用的实践
c++
bkspiderx11 小时前
C++中的volatile:从原理到实践的全面解析
开发语言·c++·volatile
君义_noip12 小时前
信息学奥赛一本通 2134:【25CSPS提高组】道路修复 | 洛谷 P14362 [CSP-S 2025] 道路修复
c++·算法·图论·信息学奥赛·csp-s
kaikaile199512 小时前
基于拥挤距离的多目标粒子群优化算法(MO-PSO-CD)详解
数据结构·算法
liulilittle12 小时前
OPENPPP2 Code Analysis One
网络·c++·网络协议·信息与通信·通信
不忘不弃13 小时前
求两组数的平均值
数据结构·算法
leaves falling13 小时前
迭代实现 斐波那契数列
数据结构·算法