一、前言
vector 适合顺序存储,map 用于key-value 键值对存储,通过唯一 key 快速查找对应 value,类似 Python 字典。
两种常用映射容器:
map:红黑树实现,按键自动升序排列,key 唯一有序unordered_map:哈希表实现,无序,查找速度远快于 map头文件:
#include <map>/#include <unordered_map>
二、map 基础定义与插入数据
cpp
运行
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main()
{
// key:string 姓名,value:int 分数
map<string, int> stuMap;
// 方式1:[]赋值,key不存在自动创建
stuMap["小明"] = 95;
stuMap["小红"] = 88;
// 方式2:insert插入pair键值对
stuMap.insert(make_pair("小李", 76));
return 0;
}
三、元素访问、查找
map[key]:key 不存在会插入默认 value,查找不推荐find(key):返回迭代器,找不到返回end(),无新增副作用(推荐查找)
cpp
运行
auto it = stuMap.find("小明");
if(it != stuMap.end())
{
cout << "姓名:" << it->first << " 分数:" << it->second << endl;
}
else
{
cout << "未找到该学生" << endl;
}
it->first:取键 keyit->second:取值 value
四、遍历 map 容器
cpp
运行
// 迭代器遍历
for(map<string, int>::iterator it = stuMap.begin(); it != stuMap.end(); it++)
{
cout << it->first << ":" << it->second << endl;
}
// C++11范围for
for(auto &pair : stuMap)
{
cout << pair.first << " " << pair.second;
}
五、删除与清空
erase(key):根据键删除对应键值对erase(迭代器):删除迭代器指向元素clear():清空全部数据
cpp
运行
stuMap.erase("小红");
stuMap.clear();
六、unordered_map 哈希无序映射
语法和 map 完全一致,区别:
内部哈希表,不排序,遍历顺序随机
海量数据查找 O (1),性能优于 map
key 类型必须支持哈希函数(string、int 原生支持)
cpp
运行
#include <unordered_map>
unordered_map<string, int> hashMap;
hashMap["张三"] = 91;
七、map 与 unordered_map 场景选择
要求按键自动排序、少量数据遍历:选
map高频查找、海量数据,不需要排序:选
unordered_map
八、新手避坑
使用
[]查找不存在的键,会自动插入空记录污染数据,查找用find()map 的 key 不可重复,重复插入相同 key 会覆盖旧 value
unordered_map 不支持自定义复杂结构体 key,需手动实现哈希函数
迭代器 erase 后,原迭代器失效,需接收返回值或重新查找
九、综合实战:学生信息查询系统(姓名查分数)
cpp
运行
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main()
{
map<string, int> scoreDb;
// 批量录入数据
scoreDb["小明"] = 96;
scoreDb["小红"] = 83;
scoreDb["小张"] = 79;
string searchName;
cout << "输入学生姓名查询分数:";
cin >> searchName;
auto res = scoreDb.find(searchName);
if(res != scoreDb.end())
{
cout << searchName << " 的分数是:" << res->second << endl;
}
else
{
cout << "数据库无该学生记录" << endl;
}
return 0;
}
十、下期预告
下一篇:C++ 综合实战:控制台学生成绩管理系统完整项目