C++17: map & multimap—— 键值映射容器

mapmultimap 是 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

五、总结

  1. map :有序、键唯一、支持 [],适合唯一键映射场景
  2. multimap :有序、键可重复、不支持 [],适合一对多映射场景
  3. 自动排序,查找稳定,适合对顺序有要求的场景
相关推荐
星空椰10 小时前
Python 面向对象高级:继承与类定义详解
开发语言·python
wunaiqiezixin10 小时前
如何在C++中创建和管理线程
c++
白露与泡影11 小时前
2026大厂Java面试题大全!牛客网最新版
java·开发语言
凯瑟琳.奥古斯特11 小时前
高阶子查询题目精炼
开发语言·数据库·python·职场和发展·数据库开发
雪度娃娃11 小时前
转向现代C++——在意为改写的函数添加 override
开发语言·c++
王老师青少年编程11 小时前
csp信奥赛C++高频考点专项训练之前缀和&差分 --【一维差分】:[NOIP 2018 提高组] 铺设道路
c++·前缀和·差分·csp·高频考点·信奥赛·铺设道路
星马梦缘11 小时前
aaaaa
数据结构·c++·算法
喵星人工作室12 小时前
C++火影忍者1.1.2
开发语言·c++
basketball61612 小时前
C++ 中的 ptrdiff_t 详解
开发语言·c++
wunaiqiezixin13 小时前
互斥锁与自旋锁的区别
c++