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

3.7-STL(七)(map篇)

  1. ### 这里重点学习map
  2. ### 在实际做题过程中,multimap几乎用不到
  3. ### unordered_map拥有极好的平均时间复杂度和极差的最坏时间复杂度,所以他的时间复杂度是不稳定的,unordered_map一般用不到,要做一个了解

1.map

  • map是一种关联容器,用于存储一组键值对(key-value pairs),其中每个键(key)都是唯一的
  • map容器根据键来自动进行排序,并且可以通过键快速查找对应的值
  • map容器使用红黑树(Red-Black Tree)数据结构来实现,具有较快的插入,删除和查找操作的时间复杂度0(logn)

map的定义和结构如下:

template <class Key, class T,class Compare =less<Key>, class Allocator=allocator<pair<const Key, T>>> class map;
  1. Key:表示存储在map中的键(key)的类型
  2. T:表示存储在map中的值(value)的类型
  3. Compare:表示用于比较键的函数对象的类型,默认为less,使用键类型的默认比较函数
  4. Allocator:表示用于分配内存的分配器类型,默认为allocator


2.multimap

  • multimap是一种关联容器,类似于map,但允许存储多个具有相同键的键值对
  • multimap容器根据键来自动进行排序,并且可以通过键快速查找对应的值
  • multimap容器使用红黑树(Red-Black Tree)数据结构来实现,具有较快的插入,删除和查找操作的时间复杂度

multimap的定义和结构如下:

template <class Key,class T,class Compare =less<key>, class Allocator=allocator<pair<const Key,T>>> class multimap;
  1. Key:表示存储在multimap中的键(key)的类型
  2. T:表示存储在multimap中的值(value)的类型
  3. Compare:表示用于比较键的函数对象的类型,默认为less,使用键类型的默认比较函数
  4. Allocator:表示用于分配内存的分配器类型,默认为allocator


3.unordered_map

  • unordered_map是一种关联容器,用于存储一组键值对(key-value pairs),其中每个键(key)都是唯一的
  • 与map和multimap不同,unordered_map不会根据键的顺序进行排序,而是使用哈希函数将键映射到存储桶中,这使得unordered_map具有更快的插入,删除和查找操作的时间复杂度,但不保证元素的顺序

unordered_map的定义和结构如下:

template <class Key, class T, class Hash = hash<Key>, class KeyEqual=equal_to<Key>, class Allocator=allocator<pair<const Key,T>>> class unordered_map;
  • Key:表示存储在unordered map中的键(key)的类型。
  • T:表示存储在unordered map中的值(value)的类型。
  • Hash:表示用于计算键的哈希值的函数对象的类型,默认为hash,使用键类型的默认哈希函数
  • KeyEqual:表示用于比较键的函数对象的类型,默认为equal_to,使用键类型的默认比较函数
  • Allocator:表示用于分配内存的分配器类型,默认为allocator

  • ### 一般情况下我们更愿意使用复杂度稳定的map而不是unordered map


4.代码示例

  • map
    #include<iostream> #include<map> using namespace std; int main(){ //创建并初始化map map<int,string>myMap={{1,"Apple"},{2,"Banana"},{3,"Orange"}}; //插入函数 myMap.insert(make_pair(4,"Grapes")); //查找和访问元素 cout<<"Value at key 2:"<<myMap[2]<<"\n"; //遍历并打印map中的元素 for(const auto&pair:myMap){ cout<<"Key:"<<pair.first<<",Value:"<<pair.second<<"\n"; } //删除元素 myMap.erase(3); //判断元素是否存在 if(myMap.count(3)==0){ cout<<"Key 3 not found."<<"\n"; } //清空map myMap.clear(); //判断map是否为空 if(myMap.empty()){ cout<<"Map is empty."<<"\n"; } return 0; }
  • ### 一般不会手动初始化
  • ### insert那行也可以这样写myMap.insert({Key,Value}
  • ### 注意myMap[3]=0时,这个count(3)依然是不为0的,因为它的键值对存在,只不过值为0

输出:


  • multimap
    #include<iostream> #include<map> using namespace std; int main(){ //创建并初始化 multimap multimap<int,string>myMultimap={{1,"Apple"},{2,"Banana"},{2,"Orange"}}; //插入元素 myMultimap.insert(make_pair(3,"Grapes")); //查找和访问元素 auto range=myMultimap.equal_range(2); for(auto it=range.first;it!=range.second;++it){ cout<<"Key:"<<it->first<<",Value:"<<it->second<<"\n"; } //遍历并打印multimap中的元素 for(const auto&pair:myMultimap){ cout<<"Key:"<<pair.first<<",Value:"<<pair.second<<"\n"; } //删除元素 myMultimap.erase(2); //判断元素是否存在 if(myMultimap.count(2)==0){ cout<<"Key 2 not found."<<"\n"; } //清空multimap myMultimap.clear(); //判断multimap是否为空 if(myMultimap.empty()){ cout<<"Multimap is empty."<<"\n"; } return 0; }
  • ### 因为它允许有多个相同键,所以它就不能用[ ]来取出,要用equal_range(Key); //range它表示迭代器的一个范围,range.first就是起始迭代器,range.second就是终止迭代器的下一位

输出:


  • unordered_map
#include<iostream> #include<unordered_map> using namespace std; int main(){ //创建并初始化unordered_map unordered_map<string,int>myMap={{"Apple",3},{"Banana",5},{"Orange",2}}; //插入元素 myMap.insert(make_pair("Grapes",4)); //查找和访问元素 cout<<"Value for key 'Banana':"<<myMap["Banana"]<<"\n"; //遍历并打印undordered_map中的元素 for(const auto&pair:myMap){ cout<<"Key:"<<pair.first<<",Value:"<<pair.second<<"\n"; } //删除元素 myMap.erase("Orange"); // 判断元素是否存在 if(myMap.count("Orange")==0){ cout<<"Key 'Orange' not found."<<"\n"; } //清空undorderd_map myMap.clear(); //判断undorderd_map是否为空 if(myMap.empty()){ cout<<"Unordered_map is empty."<<"\n"; } return 0; }

输出:

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

相关文章:

  • Qcom平台通过Hexagon IDE 测试程序性能指导
  • 如何快速实现prettier-vscode多语言界面配置:终极国际化指南
  • 2026年PPR堵头优质源头厂家推荐,哪家性价比高 - 工业设备
  • 2026年泸县黄金回收机构排名,黄金回收免费上门正规商家全解析 - 工业品牌热点
  • Linux 环境变量详解
  • 如何为AppManager贡献代码:完整的Android应用管理项目开发者指南
  • Ant Design Blazor 快速创建项目
  • Mysql 中数据主键类型不一样导致数据插入速度快慢问题
  • 5个必学的AST Explorer使用技巧:快速掌握代码分析神器
  • 如何从源码构建Sigil:跨平台EPUB编辑器的完整指南
  • 【01最短路 BFS】1368. 使网格图至少有一条有效路径的最小代价
  • RLHF在多模态领域的应用:MM-RLHF框架与视觉语言模型对齐技术
  • Taming Transformers完整贡献指南:10个技巧助你成为AI图像合成专家
  • Dolt:将Git与数据库完美结合的开源项目
  • Redis 的用途
  • 如何快速掌握Embark框架:从代码规范到贡献流程的完整指南
  • Vue3商城移动端调试终极指南:Chrome DevTools与Vue DevTools实战技巧
  • Dolt:数据版的Git,让数据库管理更智能
  • Prisma与监控系统:10个性能指标收集和应用监控实现终极指南
  • Gorilla合作伙伴计划:API提供商如何接入生态系统
  • OCRmyPDF与文档扫描标准:符合ISO 19005(PDF/A)的处理
  • 用UE5 Multi-User Editing实现远程团队协作:公网部署+会话管理全流程解析
  • 如何快速掌握AppManager:10个实用技巧提升Android管理效率
  • LeetCode 热题 100 之 215. 数组中的第K个最大元素 347. 前 K 个高频元素 295. 数据流的中位数
  • SecretVault强网杯2025 Web题解:从JWT绕过到HTTP头注入的实战剖析
  • sc-im配置与自定义:打造属于你的终端表格工作流
  • Buildroot+Qt开发:嵌入式GUI应用的快速部署方案
  • 从安装到渲染:MakeHuman完整工作流教程(含Blender导出技巧)
  • OpenVPN 2.5.9 快速部署与多端口转发实战指南
  • PyCaret特征工程:轻松构建专业级特征缩放与选择Pipeline