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

【C++】map和set

目录

一、关联式容器

 二、键值对

三、set

🍔set的介绍

🍟set的模板参数列表

🌮set的构造​编辑

🥪set的迭代器 

​编辑

🥙set的容量

🥗set的修改操作

🌭 set的使用

 四、map

🍔map的介绍

🍟map的模板参数列表

🌮map的构造

🥪map的迭代器

🥙map的容量和元素访问

​编辑

🥗map中的修改操作

🌭 map的使用 

 五、multiset和multimap

🍔multiset

🍟multimap

 六、结语


一、关联式容器

前面我们已经接触过STL中的部分容器,比如:vector、list、deque等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身

那什么是关联式容器?它与序列式容器有什么区别?

关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是结构的键值对,在数据检索时比序列式容器效率更高。

 


 二、键值对

🌟用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。

👉比如:现在要建立一个英汉互译的字典,那该字典中必然有英文单词与其对应的中文含义,而且,英文单词与其中文含义是一一对应的关系,即通过该英文单词,在词典中就可以找到与其对应的中文含义

关于键值对的定义:

template <class T1, class T2>struct pair 
{typedef T1 first_type;typedef T2 second_type;T1 first;T2 second;pair(): first(T1()), second(T2()){}pair(const T1& a, const T2& b): first(a), second(b){}};

 


三、set

🍔set的介绍

set官方文档介绍

👉帮大家搬过来了:

🍟set的模板参数列表


🔥注意:

1️⃣T:set中存放元素的类型,可以看作只存value,但实际在底层存储的是<value,value>的键值对

2️⃣Compare:set元素默认按照小于来比较

3️⃣Alloc:set中元素空间的管理方式

🌮set的构造

🥪set的迭代器 

🥙set的容量

🥗set的修改操作

🌭 set的使用

 


 四、map

🍔map的介绍

map官方文档介绍

👉帮大家搬过来了

🍟map的模板参数列表


🔥注意:

1️⃣Key:键值对中key的类型

2️⃣T:键值对中value的类型

3️⃣Compare:比较器的类型,map中的元素是按key来比较的,缺省情况下按照小于来比较

4️⃣Alloc:通过空间配置器来申请底层空间

🌮map的构造

🥪map的迭代器

🥙map的容量和元素访问

🔥注意:

operator[]: 在元素访问时,如果该key不存在,operator[]会用默认value和key构造键值对然后插入

at():如果key不存在,直接抛异常

🥗map中的修改操作

🌭 map的使用 

void TestMap()
{map<string, string> m;// 向map中插入元素的方式:// 1.将键值对<"peach","桃子">插入map中,用pair直接来构造键值对m.insert(std::pair<string, string>("peach", "桃子"));// 2.将键值对<"peach","桃子">插入map中,用make_pair函数来构造键值对m.insert(make_pair("banan", "香蕉"));// 3.借用operator[]向map中插入元素,将<"apple", "">插入map中,插入成功,返回value的引用,将“苹果”赋值给该引用结果m["apple"] = "苹果";cout << m.size() << endl;//结果为3// 用迭代器去遍历map中的元素,可以得到一个按照key排序的序列for (auto& e : m)cout << e.first << "--->" << e.second << endl;cout << endl;// map中的键值对key一定是唯一的,如果key存在将插入失败auto ret = m.insert(make_pair("peach", "桃色"));if (ret.second)cout << "<peach, 桃色>不在map中, 已经插入" << endl;elsecout << "键值为peach的元素已经存在:" << ret.first->first << "--->"<< ret.first->second << " 插入失败" << endl;// 删除key为"apple"的元素m.erase("apple");if (1 == m.count("apple"))cout << "apple还在" << endl;elsecout << "apple被吃了" << endl;
}

 


 五、multiset和multimap

🍔multiset

🌟multiset相对与set就是允许元素可以重复


🔥注意:

1️⃣multiset 在底层存储的也是<value,value>的键值对

2️⃣使用迭代器对multiset中的元素进行遍历,可以得到有序的序列

3️⃣在multiset中元素不可以修改

🍟multimap

🌟multimap相对与map就是允许key可以重复


🔥注意:

1️⃣multimap中的key是可以重复的

2️⃣multimap中没有重载operator[]操作

3️⃣使用时与map包含的头文件相同


 六、结语

🫡你的点赞和关注是作者前进的动力!

🌞最后,作者主页有许多有趣的知识,欢迎大家关注作者,作者会持续更新有意思的代码,在有趣的玩意儿中成长!

相关文章:

  • Windows11-24h2的任务栏时间显示秒 笔记250417
  • 更强的视觉 AI!更智能的多模态助手!Qwen2.5-VL-32B-Instruct-AWQ 来袭
  • 【OSG学习笔记】Day 3: 加载你的第一个3D模型
  • Pytest 的钩子函数 (Hook Functions):定制你的测试流程 (Pytest 系列之五)
  • 关于webpack的知识点
  • 67. 二进制求和
  • MongoServerError: Authentication failed.处理办法
  • 利用 Java 爬虫按关键字搜索淘宝商品
  • ServletContextListener 的用法笔记250417
  • 第十七届“华中杯”B 题校园共享单车的调度与维护问题分析
  • 第九章:强化学习(RL)赋能 AI Agents:潜力、挑战与问题建模
  • 【MCP】第一篇:MCP协议深度解析——大模型时代的“神经连接层“架构揭秘
  • 极狐GitLab 安全文件管理功能介绍
  • C++纯虚函数
  • 05-libVLC的视频播放器:设置倍速播放
  • C# 数据类型||C# 类型转换
  • 【Rust基础】使用Rocket构建基于SSE的流式回复
  • 借源网荷储之力,开启低碳园区 “绿色蝶变”
  • 优选算法系列(7.BFS 解决最短路问题)
  • RMSIN论文阅读
  • 新华时评:需要“重新平衡”的是美国心态
  • 人物|德国新外长关键词:总理忠实盟友、外交防务专家、大西洋主义者
  • 民生访谈|支持外贸企业拓内销,上海正抓紧制定便利措施
  • 解放日报:上海深化改革开放,系统集成创新局
  • 万科:一季度营收近380亿元,销售回款率超100%
  • 文天祥与“不直人间一唾轻”的元将唆都