📘 std::pair 与 std::map 基础
目标:知道"是什么"和"为什么用",不求细节。
✅ 核心问题 & 简答
| 问题 | 简明答案 |
|---|---|
1. pair 是什么? |
一个能装两个值 的小盒子,比如 {名字, 年龄}。 |
2. map 是什么? |
一个字典 ,通过"键"(如 "apple")快速找到"值"(如 5)。 |
| 3. 它们有什么关系? | map 里每个元素其实就是一个 pair(键+值)。 |
4. 为什么要用 map? |
比遍历数组快得多!找数据像查字典一样高效。 |
| 5. 最常见的操作有哪些? | 增 (插入)、删 (删除)、改 (修改)、查(查找)。 |
cpp
// 尝试猜一猜下面代码会输出什么?
#include <iostream>
#include <map>
using namespace std;
int main() {
map<string, int> scores;
scores["Alice"] = 95;
scores["Bob"] = 87;
cout << scores["Alice"] << endl;
return 0;
}
✅ 答案:95 ------ 你已经在用 map 了!
目标:厘清细节、识别陷阱、建立最佳实践。
✅ 关键概念回顾
| 概念 | 要点 |
|---|---|
pair<T1, T2> |
- 成员:.first, .second- 创建:make_pair(a,b) 或 {a,b}- 用途:组合两个相关数据 |
map<K, V> 元素类型 |
pair<const K, V>(key 不可变!) |
| 初始化方式 | {} 初始化列表最简洁;范围构造适合从 vector 转换 |
| 安全查询 | 用 find() 或 count(),不要用 [] 查不存在的 key! |
| 插入 vs 赋值 | insert() 不覆盖;operator[] 会创建默认值 |
⚠️ 常见陷阱自查
| 陷阱 | 正确做法 |
|---|---|
❌ 用 m[key] 判断 key 是否存在 |
✅ 改用 m.count(key) 或 m.find(key) != m.end() |
| ❌ 修改 map 中元素的 key | ✅ key 是 const,不能改!要改需先删后插 |
❌ 忽略 insert() 的返回值 |
✅ 检查 .second 判断是否插入成功 |
❌ 在循环中用 [] 访问可能不存在的 key |
✅ 先 find(),再通过迭代器访问 |
💡 最佳实践口诀
"查用 find,插用 insert,改用 [] 或迭代器,删用 erase。"
🧪 动手验证(巩固记忆)
-
尝试让
map插入失败:cppmap<string, int> m{{"x", 1}}; auto [it, ok] = m.insert({"x", 99}); cout << (ok ? "Inserted" : "Already exists") << endl; // 输出? -
观察
operator[]的副作用:cppmap<string, int> m; cout << m.size() << endl; // 0 int v = m["missing"]; // 触发插入! cout << m.size() << endl; // 1(不是 0!)
📝 三、一句话总结
pair是键值对的"原子单位",map是基于pair构建的高效字典------用对方法,事半功倍;用错操作,埋下隐患。
🔜 下一步建议
- ✅ 如果已掌握:尝试用
unordered_map对比性能差异。 - 🔄 如果仍有疑问:重点重读"安全查询"和"插入 vs 赋值"部分。
- 🛠️ 实战练习:写一个程序统计一段文本中每个单词出现的次数(用
map<string, int>)。
坚持"预习 → 学习 → 复盘"闭环,你的 C++ 能力会稳步提升!加油 💪