map 和 multimap 是 C++ STL 中键值对(key-value) 存储容器,底层基于红黑树 实现,会自动按键升序排序,查找效率高,适合需要有序存储键值对的场景。
一、核心知识点
1. 共性
- 存储结构:
pair<key, value>(键 + 值) - 排序规则:按键自动升序排序
- 底层实现:红黑树
- 查找 / 插入 / 删除效率:
O(log n) - 头文件:
#include <map>
2. 区别
- map :键唯一 ,不允许重复键,支持
[]运算符访问 - multimap :键可重复 ,允许相同键对应多个值,不支持
[]
二、常用操作函数
| 操作 | 功能 |
|---|---|
insert({key, val}) |
插入键值对 |
find(key) |
查找键,返回迭代器 |
erase(key) |
删除指定键的所有元素 |
size() |
获取元素个数 |
empty() |
判断是否为空 |
clear() |
清空容器 |
三、代码示例:map(键唯一)
cpp
#include <iostream>
#include <map>
using namespace std;
int main() {
// 1. 创建map:键int,值string
map<int, string> mp;
// 2. 插入数据(两种方式)
mp[1] = "张三";
mp[2] = "李四";
mp.insert({3, "王五"});
// 3. 键重复:会覆盖原有值
mp[1] = "赵六";
// 4. 遍历(按键自动升序)
cout << "map遍历结果:" << endl;
for (auto& p : mp) {
cout << "键:" << p.first << ",值:" << p.second << endl;
}
// 5. 查找元素
auto it = mp.find(2);
if (it != mp.end()) {
cout << "找到键2,值为:" << it->second << endl;
}
return 0;
}
//运行结果
map遍历结果:
键:1,值:赵六
键:2,值:李四
键:3,值:王五
找到键2,值为:李四
四、代码示例:multimap(键可重复)
cpp
#include <iostream>
#include <map>
using namespace std;
int main() {
// 1. 创建multimap
multimap<int, string> mmp;
// 2. 插入(支持重复键)
mmp.insert({1, "苹果"});
mmp.insert({1, "香蕉"});
mmp.insert({2, "橙子"});
// 3. 遍历(按键排序,重复键相邻)
cout << "multimap遍历结果:" << endl;
for (auto& p : mmp) {
cout << "键:" << p.first << ",值:" << p.second << endl;
}
// 4. 统计重复键的个数
cout << "键1的元素个数:" << mmp.count(1) << endl;
return 0;
}
//运行结果
multimap遍历结果:
键:1,值:苹果
键:1,值:香蕉
键:2,值:橙子
键1的元素个数:2
五、总结
- map :有序、键唯一、支持
[],适合唯一键映射场景 - multimap :有序、键可重复、不支持
[],适合一对多映射场景 - 自动排序,查找稳定,适合对顺序有要求的场景