std::pair` 与 `std::map` 基础

📘 std::pairstd::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。"

🧪 动手验证(巩固记忆)
  1. 尝试让 map 插入失败

    cpp 复制代码
    map<string, int> m{{"x", 1}};
    auto [it, ok] = m.insert({"x", 99});
    cout << (ok ? "Inserted" : "Already exists") << endl; // 输出?
  2. 观察 operator[] 的副作用

    cpp 复制代码
    map<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++ 能力会稳步提升!加油 💪

相关推荐
2601_962071573 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
淡海水4 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
leobertlan4 小时前
好玩系列:训练一个神经网络模型指导小孩玩游戏2-大局观教练
算法
CS_Zero5 小时前
C语言sizeof是函数吗?
c语言·开发语言
Tisfy5 小时前
LeetCode 3876.构造奇偶一致的数组 II:三种情况分类讨论(其实还是脑筋急转弯)
算法·leetcode·题解·脑筋急转弯
-今昭-6 小时前
《V2V 迁移实战:将 VMware 虚拟机转为 OpenStack 可用 Glance qcow2 镜像》
开发语言·python
乐迪信息6 小时前
智慧港口船舶AI算法实现在线状态监测
大数据·人工智能·深度学习·算法·计算机视觉
黑马程序员毕设7 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
木井巳8 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
心抵鹊8 小时前
归并排序之翻转对(hard)
数据结构·算法