用户_29571846
发布于 2026-06-22 / 1 阅读
0
0

C++ STL map /unordered_map 键值对映射容器完整教程

一、前言

vector 适合顺序存储,map 用于key-value 键值对存储,通过唯一 key 快速查找对应 value,类似 Python 字典。

两种常用映射容器:

  1. map:红黑树实现,按键自动升序排列,key 唯一有序

  2. 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;
}

三、元素访问、查找

  1. map[key]:key 不存在会插入默认 value,查找不推荐

  2. find(key):返回迭代器,找不到返回end(),无新增副作用(推荐查找)

cpp

运行

auto it = stuMap.find("小明");
if(it != stuMap.end())
{
    cout << "姓名:" << it->first << " 分数:" << it->second << endl;
}
else
{
    cout << "未找到该学生" << endl;
}
  • it->first:取键 key

  • it->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 完全一致,区别:

  1. 内部哈希表,不排序,遍历顺序随机

  2. 海量数据查找 O (1),性能优于 map

  3. key 类型必须支持哈希函数(string、int 原生支持)

cpp

运行

#include <unordered_map>
unordered_map<string, int> hashMap;
hashMap["张三"] = 91;

七、map 与 unordered_map 场景选择

  1. 要求按键自动排序、少量数据遍历:选map

  2. 高频查找、海量数据,不需要排序:选unordered_map

八、新手避坑

  1. 使用[]查找不存在的键,会自动插入空记录污染数据,查找用find()

  2. map 的 key 不可重复,重复插入相同 key 会覆盖旧 value

  3. unordered_map 不支持自定义复杂结构体 key,需手动实现哈希函数

  4. 迭代器 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++ 综合实战:控制台学生成绩管理系统完整项目


评论