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++ 能力会稳步提升!加油 💪

相关推荐
lsx2024066 小时前
网站主机技术
开发语言
摇滚侠7 小时前
你是一名 java 程序员,总结定义数组的方式
java·开发语言·python
Book思议-7 小时前
【数据结构实战】C语言实现栈的链式存储:从初始化到销毁,手把手教你写可运行代码
数据结构·算法·链表··408
xyq20247 小时前
Vue3 条件语句详解
开发语言
Book思议-7 小时前
【数据结构实战】川剧 “扯脸” 与栈的 LIFO 特性 :用 C 语言实现 3 种栈结构
c语言·数据结构·算法·
3GPP仿真实验室7 小时前
【MATLAB源码】感知:CFAR 检测算法库
算法·matlab·目标跟踪
浩浩kids7 小时前
R•Homework
开发语言·r语言
fengenrong7 小时前
20260324
c++·算法
qq_416018727 小时前
设计模式在C++中的实现
开发语言·c++·算法
Evand J7 小时前
【MATLAB教程】在matlab中,gscatter和scatter两个命令的区别
开发语言·matlab·教程·绘图·命令·教学