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

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

五、总结

  1. map :有序、键唯一、支持 [],适合唯一键映射场景
  2. multimap :有序、键可重复、不支持 [],适合一对多映射场景
  3. 自动排序,查找稳定,适合对顺序有要求的场景
相关推荐
lusklusklusk24 分钟前
Python 全局变量与局部变量区别——global 关键字、__main__ 块与作用域示例
开发语言·前端·python
马剑威(威哥爱编程)37 分钟前
Python 智能体开发实战 01:装了三遍环境还在报错?虚拟环境和 DeepSeek 一次配到位
开发语言·人工智能·python·agent
qq_4663024538 分钟前
如何通过部分文件名,读取出整个文件名
c++·qt
octopus_c41 分钟前
C++ 入门
开发语言·c++·算法
步行cgn1 小时前
JSON.stringify 详解:把 JavaScript 对象变成 JSON 字符串
开发语言·javascript·json
raindayinrain2 小时前
c++新特性--实用新特性
c++
Soneswy2 小时前
C++基础篇——类与对象(中)
开发语言·c++
CoderYanger2 小时前
Java EE 进阶:5. Spring IoC&DI(第二弹):Spring IoC
java·开发语言·spring boot·spring·面试·职场和发展·java-ee
青峰讲运维2 小时前
OpenStack Heat 编排:用模板一键交付云业务,告别手动点页面
开发语言·php·openstack
MyFreeIT3 小时前
Python Windows Manual
开发语言·python