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. 自动排序,查找稳定,适合对顺序有要求的场景
相关推荐
Ada's8 小时前
【计算机基础系列】003:Python数据结构
开发语言·数据结构·python
2601_962885729 小时前
如何用 Python 计算 TRIX 三重指数平滑均线指标?
开发语言·python
还卿一钵无情泪9 小时前
Unsloth 微调 构建自己的大模型 没有GPU也能微调
linux·开发语言·人工智能·python·大模型·nlp·unsloth
倔强的石头10611 小时前
应用账号最小权限实践:读写账号、报表账号、运维账号分层
java·运维·开发语言
传人once11 小时前
页面中心圆圈放大效果如何写
开发语言·javascript·ecmascript
NeilYuen11 小时前
【C++】STL源码仿写(二):vector
开发语言·c++
蜗牛互联网11 小时前
Python消费Responses SSE事件:增量文本、超时与取消
java·开发语言·人工智能·后端·python
郝学胜_神的一滴12 小时前
游戏引擎原理与实践 04:拆解引擎基础系统与内存管理
c++·游戏
All for pursuit.12 小时前
【设计-1】208.实现Trie (前缀树)
数据结构·c++·算法·leetcode
weixin_3077791312 小时前
C++代码实现MATLAB中的crossval函数功能
开发语言·c++·算法·matlab