当前位置: 首页 > news >正文

STL中map与multimap深度解析

好的,我们将深入探讨STL中的mapmultimap容器,从接口使用到底层实现的核心特性进行详细解析。


一、基础概念与核心特性

  1. 关联容器
    mapmultimap关联容器,以键值对(Key-Value Pair)形式存储数据,支持基于键(Key)的高效查找。

    • 键的唯一性
      • map:键必须唯一,插入重复键会覆盖原有值
      • multimap:允许重复键,同一键可对应多个值
  2. 底层数据结构:红黑树
    两者均基于红黑树(Red-Black Tree)实现,具有以下特性:

    • 自平衡二叉搜索树:保证操作时间复杂度为$O(\log n)$
    • 有序性:按键的升序自动排序(可通过比较函数自定义)

二、关键接口详解

1. 插入操作
// map插入(键唯一) std::map<int, std::string> m; m.insert(std::make_pair(1, "Apple")); m[2] = "Banana"; // 下标操作符插入 // multimap插入(允许重复键) std::multimap<int, std::string> mm; mm.insert(std::make_pair(1, "Apple")); mm.insert(std::make_pair(1, "Apricot")); // 允许

https://weibo.com/tv/show/1034:5275492593631239
https://weibo.com/tv/show/1034:5275492547493898
https://weibo.com/tv/show/1034:5275492501356571
https://weibo.com/tv/show/1034:5275492463607825
https://weibo.com/tv/show/1034:5275492421664772

2. 查找与访问
// map查找(键唯一) auto it = m.find(1); if (it != m.end()) { std::cout << it->second; // 输出: Apple } // multimap查找重复键 auto range = mm.equal_range(1); // 返回迭代器区间 for (auto it = range.first; it != range.second; ++it) { std::cout << it->second << " "; // 输出: Apple Apricot }
3. 删除操作
// 通过键删除 m.erase(1); // 删除键为1的元素 // 通过迭代器删除 auto it = mm.find(2); if (it != mm.end()) { mm.erase(it); }

https://weibo.com/tv/show/1034:5275492593631239
https://weibo.com/tv/show/1034:5275492547493898
https://weibo.com/tv/show/1034:5275492501356571
https://weibo.com/tv/show/1034:5275492463607825
https://weibo.com/tv/show/1034:5275492421664772

4. 遍历与有序性
// 自动按键升序遍历 for (const auto& kv : m) { std::cout << kv.first << ": " << kv.second << std::endl; } // 输出示例: // 1: Apple // 2: Banana

三、底层机制剖析

1. 红黑树的核心优势
  • 近似平衡:树高度最多为$2\log(n+1)$,保证查找、插入、删除操作在$O(\log n)$时间内完成
  • 动态调整:通过旋转和变色维持平衡(插入/删除时最多3次旋转)
2. 自定义排序规则

通过提供比较函数(如std::greater)改变排序顺序:

std::map<int, std::string, std::greater<int>> desc_map; desc_map[3] = "Cherry"; desc_map[1] = "Apple"; // 遍历输出: 3:Cherry, 1:Apple(降序)

四、性能与注意事项

  1. 时间复杂度

    • 插入:$O(\log n)$
    • 查找:$O(\log n)$
    • 删除:$O(\log n)$
  2. 内存占用
    每个节点额外存储颜色标记和父/子指针,空间开销高于顺序容器(如vector)。

  3. 迭代器失效
    仅当删除当前元素时,其对应的迭代器会失效(其他迭代器不受影响)。


五、典型应用场景

  1. 字典类应用
    std::map<std::string, int> word_count; word_count["algorithm"] = 42;
  2. 多对一/多对多关系
    // 学生ID对应多个课程(multimap) std::multimap<int, std::string> student_courses; student_courses.insert({101, "Math"}); student_courses.insert({101, "Physics"});

六、总结

mapmultimap凭借红黑树的有序性和高效操作,成为处理键值关联数据的核心工具。理解其底层机制和接口特性,可帮助开发者在需要有序访问或重复键的场景中做出合理选择。

http://www.jsqmd.com/news/465461/

相关文章:

  • 2026年口碑好的非洲鼓10寸品牌推荐:非洲鼓12寸精选公司 - 品牌宣传支持者
  • 2026水上充气浮排厂家精选:广东水上充气浮排哪家好,实力源头工厂推荐 - 栗子测评
  • 2026广东便携式宠物泳池定制厂家哪家强,一站式定制服务优选指南 - 栗子测评
  • 智慧港口浪潮下,2026年第一季度系船柱监测系统工厂甄选指南 - 2026年企业推荐榜
  • 2026年广式点心新风向:五大正宗品牌深度解析与推荐 - 2026年企业推荐榜
  • 数据出境合规实务42问
  • 2026年3月漯河益生菌酸奶企业选型攻略与TOP服务商推荐 - 2026年企业推荐榜
  • 2026年第一季度北京石景山汽车陪练服务选购全攻略与可靠机构推荐 - 2026年企业推荐榜
  • 2026年热门的民族手鼓工厂推荐:民族手鼓源头工厂推荐 - 品牌宣传支持者
  • 开度荷重仪怎么选?2026年湖北热门厂家综合评测与推荐 - 2026年企业推荐榜
  • 2026年Q1高端按摩椅新品排行与选购深度解析 - 2026年企业推荐榜
  • 2026年口碑好的眼镜店套餐品牌推荐:绍兴本地眼镜店高口碑品牌推荐 - 品牌宣传支持者
  • 你每天敲下的 go func(),藏着这位 92 岁老人的毕生心血
  • 贵阳豆包推广2026选购指南TOP5:实测口碑推荐,3个关键点避坑更省钱 - 精选优质企业推荐榜
  • 贵阳豆包推广2026排行榜TOP5:实测调研口碑推荐,性价比避坑一篇讲透 - 精选优质企业推荐榜
  • 2026年上班族久坐必备:五大按摩椅品牌深度评测与选购指南 - 2026年企业推荐榜
  • 2026年湖北螺栓预紧力在线监测服务商选购指南 - 2026年企业推荐榜
  • 贵阳豆包推广2026深度测评TOP5:实测口碑排行榜,避坑选哪家更稳 - 精选优质企业推荐榜
  • 贵阳AI获客怎么选?2026年实测排行榜TOP5,性价比避坑看这一篇 - 精选优质企业推荐榜
  • 后端团队准备解散了。。。
  • 2026年比较好的巴西跨境电商物流公司推荐:巴西物流专线价格低服务优综合评价公司 - 品牌宣传支持者
  • 贵阳AI获客公司哪家更靠谱?2026年Q1实测榜单+避坑选择指南 - 精选优质企业推荐榜
  • 贵阳AI获客2026深度测评:3个避坑关键点,实测口碑推荐 - 精选优质企业推荐榜
  • 2026年知名的巴西专线货代公司推荐:巴西专线货代品牌公司推荐 - 品牌宣传支持者
  • 解析2026开年按摩椅销量榜:久坐族如何选对品牌? - 2026年企业推荐榜
  • **标题:发散创新|基于MQTT协议的智能家居设备状态订阅与实时控制实践**在物联网(
  • **零信任架构下的Go语言微服务身份认证实战:从理论到代码落地**在当前云原生和分布式系统飞速发展的背景下,**零信任架
  • **存算一体架构下的高效编程实践:用Rust实现内存感知的计算加速**在传统计算模
  • Android工程师职业全景与技术精粹
  • 2026年评价高的巴西海运空运海外仓一件代发公司推荐:巴西海运空运海外仓一件代发人气公司推荐 - 品牌宣传支持者