一、上期回顾

掌握 set/multiset:底层红黑树、自动排序、元素唯一 / 可重复、只能迭代器遍历。今天学 map/multimap,真正工程开发用得最多的键值对容器。


二、map 核心概念

  1. map:存储 key-value 键值对
  2. 底层依旧红黑树
  3. key 唯一、自动按 key 升序排序
  4. key 不可重复,value 可以重复
  5. 增删查效率 O(logn)

三、map 与 multimap 区别

  • map:key 唯一,不允许重复键
  • multimap:允许重复 key,同一个键可以对应多个 value

日常开发 99% 只用 map


四、map 常用构造初始化

#include <iostream>
#include <map>
#include <string>
using namespace std;

int main()
{
    // 1. 空map
    map<int, string> m1;

    // 2. 直接初始化键值对
    map<int, string> m2 = {
        {1, "张三"},
        {2, "李四"},
        {3, "王五"}
    };

    // 3. 拷贝构造
    map<int, string> m3(m2);

    return 0;
}

五、map 插入数据四种方式

map<int, string> m;

// 方式1:[] 下标插入/修改
m[1] = "张三";
m[2] = "李四";

// 方式2:insert 插入pair
m.insert(pair<int, string>(3, "王五"));

// 方式3:insert 直接大括号
m.insert({4, "赵六"});

// 方式4:value_type
m.insert(map<int, string>::value_type(5, "孙七"));

注意:

  • m[key] 如果 key 不存在,自动插入默认值
  • insert 遇到重复 key 不会覆盖

六、map 遍历方式

map<int, string> m = {{1,"A"},{2,"B"},{3,"C"}};

// 1. 迭代器遍历
for(map<int, string>::iterator it = m.begin(); it != m.end(); ++it)
{
    // it->first 键,it->second 值
    cout << it->first << " " << it->second << endl;
}

// 2. C++11 范围for
for(auto& p : m)
{
    cout << p.first << " " << p.second << endl;
}

七、map 常用核心接口

map<int, string> m;

// 大小、判空
m.size();
m.empty();

// 查找key
auto it = m.find(2);
if(it != m.end())
{
    cout << it->second << endl;
}

// 删除
m.erase(it);     // 按迭代器删
m.erase(3);      // 按键删除

// 清空
m.clear();

八、multimap 简单了解

允许同一个 key 保存多个 value,不支持 [] 下标访问

multimap<int, string> mm;
mm.insert({1, "语文"});
mm.insert({1, "数学"});
mm.insert({2, "英语"});

适合一个键对应多条记录的场景。


九、完整综合示例代码

#include <iostream>
#include <map>
#include <string>
using namespace std;

int main()
{
    map<int, string> stu;

    // 插入数据
    stu[1001] = "张三";
    stu[1002] = "李四";
    stu.insert({1003, "王五"});

    // 遍历
    cout << "map遍历结果:" << endl;
    for(auto& p : stu)
    {
        cout << "学号:" << p.first 
             << " 姓名:" << p.second << endl;
    }

    // 查找
    auto it = stu.find(1002);
    if(it != stu.end())
    {
        cout << "查到学生:" << it->second << endl;
        // 删除
        stu.erase(it);
    }

    cout << "删除后遍历:" << endl;
    for(auto& p : stu)
    {
        cout << p.first << " " << p.second << endl;
    }

    return 0;
}

十、今日核心总结

  1. map 底层红黑树,键值对存储、key 自动升序
  2. map key 唯一;multimap 允许 key 重复
  3. 四种插入方式,[] 会自动补默认值,insert 不覆盖
  4. 遍历用迭代器 / 范围 for,first取键,second取值
  5. 常用接口:find /erase/size /clear
  6. 项目开发配置、映射关系首选 map

十一、课后练习

  1. 用 map 存 3 个学号 + 姓名
  2. 查找指定学号,存在则删除
  3. 遍历输出所有键值对

更多推荐