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

C++的STL中的multimap与map比较

STL中的multimap与map比较

主要区别

特性 map multimap
键唯一性 每个键只能出现一次 允许重复键
operator[] 支持 不支持
插入操作 插入重复键会失败 总是可以插入
访问方式 可直接通过键访问值 需要特殊方法处理多值

使用示例

  1. map示例(键唯一)
#include<iostream>#include<map>#include<string>intmain(){std::map<int,std::string>studentMap;// 插入元素studentMap[101]="Alice";studentMap[102]="Bob";studentMap[103]="Charlie";// 尝试插入重复键(会覆盖原有值)studentMap[102]="Bob Updated";// 覆盖原来的"Bob"// 使用insert(不会覆盖)studentMap.insert({104,"David"});autoresult=studentMap.insert({101,"Alice Duplicate"});// 插入失败,键已存在std::cout<<"Insert 101 again? "<<(result.second?"Success":"Failed")<<"\n";// 遍历for(constauto&pair:studentMap){std::cout<<"ID: "<<pair.first<<", Name: "<<pair.second<<"\n";}// 直接通过键访问std::cout<<"Student 102: "<<studentMap[102]<<"\n";return0;}
  1. multimap示例(允许重复键)
#include<iostream>#include<map>#include<string>intmain(){std::multimap<std::string,std::string>courses;// 插入元素(允许重复键)courses.insert({"Math","Algebra"});courses.insert({"Math","Calculus"});courses.insert({"Physics","Mechanics"});courses.insert({"Math","Geometry"});// 再次插入"Math"键courses.insert({"Physics","Optics"});// 遍历所有元素std::cout<<"All courses:\n";for(constauto&course:courses){std::cout<<"Department: "<<course.first<<", Course: "<<course.second<<"\n";}// 查找特定键的所有值std::string target="Math";autorange=courses.equal_range(target);std::cout<<"\nAll Math courses:\n";for(autoit=range.first;it!=range.second;++it){std::cout<<it->second<<"\n";}// 统计特定键的数量std::cout<<"\nNumber of Math courses: "<<courses.count("Math")<<"\n";// 注意:multimap不支持operator[]// courses["Math"] = "New Course"; // 错误!无法编译return0;}

实际应用场景

场景1:电话簿(一人有多个电话)

#include<iostream>#include<map>#include<vector>intmain(){// multimap实现:一人可以有多个电话std::multimap<std::string,std::string>phonebook;phonebook.insert({"Alice","123-4567"});phonebook.insert({"Alice","987-6543"});phonebook.insert({"Bob","555-1234"});phonebook.insert({"Alice","111-2222"});// 查找Alice的所有电话autoalicePhones=phonebook.equal_range("Alice");std::cout<<"Alice's phone numbers:\n";for(autoit=alicePhones.first;it!=alicePhones.second;++it){std::cout<<" "<<it->second<<"\n";}return0;}

场景2:使用map模拟multimap功能

#include<iostream>#include<map>#include<vector>#include<string>intmain(){// 使用map<string, vector<string>>实现类似multimap功能std::map<std::string,std::vector<std::string>>studentCourses;// 添加课程studentCourses["Alice"].push_back("Math");studentCourses["Alice"].push_back("Physics");studentCourses["Bob"].push_back("Chemistry");studentCourses["Alice"].push_back("Computer Science");// 访问Alice的所有课程std::cout<<"Alice's courses:\n";for(constauto&course:studentCourses["Alice"]){std::cout<<" "<<course<<"\n";}return0;}

常用方法对比

操作 map multimap
插入 insert() 或 operator[] 只能使用 insert()
查找 find() 返回单个迭代器 equal_range() 返回迭代器对
删除 erase(key) 删除一个元素 erase(key) 删除所有匹配键的元素
计数 count() 返回0或1 count() 返回键出现的次数

选择建议

· 使用map:当需要键值对且键是唯一的,或者需要通过键快速查找/修改值
· 使用multimap:当键可能重复,且需要维护所有关联值
· 考虑替代方案:有时 map<Key, vector> 可能比multimap更方便,特别是需要随机访问特定键的所有值时

两种容器都基于红黑树实现,提供了O(log n)的查找、插入和删除操作。

http://www.cnnetsun.cn/news/73152.html

相关文章:

  • day38GPU训练及类的call方法@浙大疏锦行
  • GPT-OSS-20B vs ChatGPT:开源替代方案的性能对比实测
  • 【场景】笛卡尔积
  • GPT-OSS-20B如何通过Harmony响应格式提升专业任务准确率
  • 21届智能车赛规则文档风格借鉴:编写ACE-Step技术白皮书
  • 亚马逊云科技储瑞松:AI智能体正在重塑未来工作模式
  • ComfyUI-Manager终极安装指南:快速搭建AI绘画管理平台
  • 从数据预处理到模型部署:LLama-Factory全流程大模型训练指南
  • Windows右键菜单大改造:ContextMenuManager让你的操作效率翻倍
  • Desktop/照片太多存不下?MAZANOKE+cpolar是让存储空间+“变大”+的秘密
  • 深入理解Java的 JIT(即时编译器)
  • Electron 桌面应用开发:前端与原生交互原理及性能优化
  • LangChain+Qwen-Image-Edit-2509实现跨模态检索与编辑一体化
  • Screen Translator:打破语言壁垒的智能屏幕翻译工具解决方案
  • 少侠游戏库引入Wan2.2-T2V-5B:为独立开发者提供动态素材生成
  • JL — AC695X — 配置工具的使用
  • Wan2.2-T2V-5B结合OpenWRT打造嵌入式AI视频网关
  • NS模拟器管理新利器:ns-emu-tools全面实战手册
  • 外卖订单自动化采集工具完整使用指南:美团饿了么数据抓取解决方案
  • Git 下载加速技巧:使用CDN镜像快速拉取Qwen3-VL-8B
  • Windows系统权限突破:RunAsTI实战完全指南
  • 开源大模型新星:FLUX.1-dev镜像助力高精度文生图应用落地
  • AI音乐创作新纪元:ACE-Step开源模型助力非专业用户轻松作曲
  • 有界队列VS无界队列:阻塞队列中的“有限”与“无限”哲学
  • 10分钟搞定Windows虚拟显示器:免费扩展多屏工作空间
  • 微信小程序表格组件实战:从零到精通的数据展示方案
  • Qwen3-VL-30B跨模态推理性能评测:为何需要强大GPU支持?
  • 大数据领域分布式计算的分布式事务处理
  • Qwen-Image-Edit-2509支持对象替换与风格迁移的底层原理分析
  • Stable Diffusion 3.5 FP8如何实现低显存占用?技术架构深度解读