【C++打怪之路Lv16】-- map set

🌈 个人主页:白子寰
🔥 分类专栏:重生之我在学Linux,C++打怪之路,python从入门到精通,数据结构,C语言,C语言题集👈 希望得到您的订阅和支持~
💡 坚持创作博文(平均质量分82+),分享更多关于深度学习、C/C++,python领域的优质内容!(希望得到您的关注~)

序列式容器和关联式容器

序列容器如string、vector等存储线性数据,元素按存储顺序访问

关联容器如map、set基于红黑树实现,提供基于关键字的存储和访问

其中set存储唯一关键字(对应key模型),map存储键值对(对应key/value模型)



set系列的使用

set和multiset参考文档

<set> - C++ Reference


set类的介绍

set声明采用类型T,需支持小于比较或自定义比较函数

底层使用红黑树存储,内存由空间配置器管理,可选自定义。

通常无需指定后两个模板参数

set操作效率为O(log n),迭代器按中序遍历提供有序访问。


set的使用

insert && 范围for && 迭代器


find查找区别 && count


lower_bound && upper_bound 


multiset 


multiset和set的差异

在C++中,set和multiset都是关联容器,用于存储已排序的数据集合。

它们的主要区别在于它们对键值(或元素)的重复性的处理方式

  • set

set容器中不允许有重复的元素。每个元素都是唯一的。
当尝试插入一个已经在set中存在的元素时,插入操作将失败,并且容器保持不变。
set通常实现为一个红黑树,这意味着在set中查找、插入和删除操作的时间复杂度通常是O(log n)

  • multiset

multiset容器允许存储重复的元素。
在multiset中可以插入相同的元素多次,每个元素都会被独立存储。
与set一样,multiset也是基于红黑树实现的,因此它也提供了对元素的排序,并且查找、插入和删除操作的时间复杂度通常是O(log n)

  • 查找操作

在set中,由于元素唯一,find操作会返回指向找到元素的迭代器,或者如果没有找到则返回end()迭代器。
在multiset中,find操作同样可以用来查找元素,但由于可能有多个相同的元素,它只保证返回一个匹配元素的迭代

  • 删除操作

在set中,erase操作会删除指定的元素(如果存在),并且由于元素唯一,只会删除一个匹配的元素。
在multiset中,erase操作可以删除所有匹配的元素,或者只删除一个特定的实例


选择使用set还是multiset取决于你的具体需求:

如果你需要确保元素的唯一性,应该使用set

如果你需要存储多个相同的元素并保持它们的排序,则应该使用multiset



map系列的使用

map和multiset参考文档

<map> - C++ Reference


map类的介绍

C++中的map类是一种关联容器,它存储键值对,其中键是唯一的,而值则可以是重复的。map类属于STL(标准模板库)的一部分,它按照键的升序自动排序。

以下是map类的一些基本特性和用法:

特性

  1. 键的唯一性:在map中,每个键都是唯一的,不能有重复的键。
  2. 自动排序map根据键的值自动排序,默认是升序。
  3. 键值对存储map存储键值对,可以通过键快速访问对应的值。
  4. 红黑树实现map通常是基于红黑树实现的,这意味着插入和查找操作的时间复杂度为O(log n)

map的使用

map的四种插入方式、迭代器的使用及范围for

void Test1()
{map<string, string> dict;// 一、pair<string, string> kv1 = {"left", "左边"};dict.insert(kv1);// 二、dict.insert(pair<string, string>("right", "右边"));// 三、dict.insert(make_pair<string, string>("up", "上边"));// 四、dict.insert({ "down","下边" });// 五、map<string, string> dict1 = { {"left", "左边"},{"right", "右边"},{"up", "上边"},{"down","下边"} };// 迭代器map<string, string>::iterator it = dict.begin();while (it != dict.end()){cout << (*it).first << ":" << (*it).second << endl;++it;}cout << endl;// 范围for①for (auto& e : dict1){cout << e.first << ":" << e.second << endl;}cout << endl;// 范围for②for (auto& [x, y] : dict1){cout << x << ":" << y << endl;}
}


map简单字典的实现

int main()
{map<string, string> dict = { { "left","左边" }, { "right","右边" }, { "up","上边" }, { "down","下边" } };string str;while (cin >> str){auto ret = dict.find(str);if (ret != dict.end()){cout << "-->" << ret->second << endl;}else{cout << "查无此单词" << endl;}}return 0;
}

 CTRL + Z 退出


使用map对于水果(牛奶)的计数 

int main()
{string arr[] = { "苹果","香蕉","牛奶","苹果","香蕉","苹果","牛奶" };map<string, int> CountFruit;for (auto& str : arr){auto ret = CountFruit.find(str);if (ret == CountFruit.end()){CountFruit.insert({ str,1 });}else{ret->second++;}}for (auto& e : CountFruit){cout << e.first << " : " << e.second << endl;}return 0;
}


multimap和map的差异

multimap和map在C++中都是关联容器,用于存储键值对,但它们之间有几个关键差异:

  • 唯一性

map:在map中,每个键必须是唯一的。如果你尝试插入一个具有相同键的元素,它将替换掉具有相同键的现有元素。
multimap:与map不同,multimap允许键重复。因此,你可以有多个具有相同键的元素。

  • 实现方式

map:通常是基于红黑树实现的,这使得元素按照键的升序排列,并保证查找、插入和删除操作的时间复杂度为O(log n)。
multimap:同样基于红黑树实现,但由于允许多个相同键的存在,其行为略有不同。

  • 操作

插入:

对于map,插入操作会检查键是否已存在,如果存在则替换旧值。

对于multimap,插入操作不会检查键的唯一性,因此可以插入多个相同键的元素
查找:

在map中,你可以使用find()函数查找特定的键,并且最多只能找到一个匹配项。

在multimap中,find()函数将返回第一个匹配的键值对,但你可能需要使用equal_range()函数来找到所有具有相同键的元素。
删除:

在map中,使用erase()函数可以删除具有特定键的单个元素。

在multimap中,erase()函数可以删除具有特定键的所有元素,或者你可以指定一个迭代器来删除单个元素。

  • 总结

选择map还是multimap取决于你的具体需求。

如果你需要每个键对应唯一的值,那么应该使用map

如果你需要存储具有相同键的多个值,那么应该使用multimap



**********************************************************分割线*****************************************************************************
完结!!!
感谢浏览和阅读。

等等等等一下,分享最近喜欢的一句话:

“万年太久,只争朝夕”。

我是白子寰,如果你喜欢我的作品,不妨你留个点赞+关注让我知道你曾来过。
你的点赞和关注是我持续写作的动力!!! 
好了划走吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/480482.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AD7606使用方法

AD7606是一款8通道最高16位200ksps的AD采样芯片。5V单模拟电源供电&#xff0c;真双极性模拟输入可以选择10 V&#xff0c;5 V两种量程。支持串口与并口两种读取方式。 硬件连接方式&#xff1a; 配置引脚 引脚功能 详细说明 OS2 OS1 OS2 过采样率配置 000 1倍过采样率 …

利用Python爬虫获取1688商品类目:技术解析

在电商领域&#xff0c;数据的获取和分析对于市场趋势的把握至关重要。1688作为中国领先的B2B电商平台&#xff0c;其商品类目的数据对于商家来说具有极高的价值。本文将详细介绍如何使用Python编写爬虫程序&#xff0c;以合法合规的方式获取1688商品类目信息。 Python爬虫技术…

全文单词统计

目标&#xff1a;统计词频 import scala.io.Source //知识点 //1.字符串.split("分隔符")&#xff1a;把字符串用指定的分隔符。拆分成多份&#xff0c;保存在数组中 object test1 {def main(args: Array[String]): Unit { //从文件1.txt中读入内容val contentSourc…

【SPIE出版|四大高校联合举办】先进算法与图像处理技术国际学术会议(IC-AAIP 2025)

&#x1f4da;IC-AAIP 2025【ISSN:0277786X】 2025年先进算法与图像处理技术国际学术会议 ⏰时间&#xff1a;2025年8月9日至10日 &#x1f440;地点&#xff1a;中国沈阳 &#x1f4dd;出版商&#xff1a;SPIE 组委负责人刘老师&#xff1a;13660240104 2025年先…

小程序-基于java+SpringBoot+Vue的戏曲文化苑小程序设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

【C/C++】内存管理详解:从new/delete到智能指针的全面解析

文章目录 更多文章C/C中的传统内存管理方式new和delete运算符malloc和free函数传统内存管理的弊端 智能指针的崛起智能指针的定义与作用C11引入的标准智能指针 详解C标准智能指针std::unique_ptr特点使用方法适用场景 std::shared_ptr特点使用方法适用场景 std::weak_ptr特点使…

通过 SSH 进行WordPress网站的高级服务器管理

我在管理hostease的服务器时&#xff0c;时常需要通过SSH登录服务器进行修改。而在网站管理中&#xff0c;SSH不仅是一个基础工具&#xff0c;更是高级用户用来精细化管理和优化服务器的重要工具。通过SSH&#xff0c;你可以深入监控服务器的性能、精细管理系统资源&#xff0c…

MFC 对话框中显示CScrollView实例

有时候我们需要在对话框中显示CScrollView效果的控件&#xff0c;类似于以下效果&#xff1a; 使用实例可参考&#xff1a;MFC对话框显示CScrollView例子_哔哩哔哩_bilibili 创建CScrollView中显示的子对话框与子类&#xff1a; 两个对话框对应的类&#xff1a; CScrollView继…

vue3 ajax获取json数组排序举例

使用axios获取接口数据 可以在代码中安装axios包&#xff0c;并写入到package.json文件&#xff1a; npm install axios -S接口调用代码举例如下&#xff1a; const fetchScore async () > {try {const res await axios.get(http://127.0.0.1:8000/score/${userInput.v…

详解登录MySQL时出现SSL connection error: unknown error number错误

目录 登录MySQL时出错SSL connection error: unknown error number 出错原因 使用MySQL自带的工具登录MySQL 登陆之后&#xff0c;使用如下命令进行查看 解决方法 找到MySQL8安装目录下的my.ini配置文件 记事本打开my.ini文件&#xff0c;然后按下图所示添加配置 此时再…

mini-spring源码分析

IOC模块 关键解释 beanFactory&#xff1a;beanFactory是一个hashMap, key为beanName, Value为 beanDefination beanDefination: BeanDefinitionRegistry&#xff0c;BeanDefinition注册表接口&#xff0c;定义注册BeanDefinition的方法 beanReference&#xff1a;增加Bean…

linux内核读写硬盘文件 kernel_writekernel_read

简介 在内核中读取硬盘文件&#xff0c;内核5.10测试了下&#xff0c;可以正常运行。 代码 1. 使用filp_open打开文件 2. 使用kernel_write和kernel_read读写文件 3. 使用filp_close关闭文件 #include <linux/module.h> #include <linux/init.h> #include &l…

记录一次 k8s 节点内存不足的排查过程

背景&#xff1a;前端服务一直报404&#xff0c;查看k8s日志&#xff0c;没发现报错&#xff0c;但是发现pods多次重启。 排查过程&#xff1a; 查看pods日志&#xff0c;发现日志进不去。 kubectrl logs -f -n weave pod-name --tail 100查看pod describe kubectl describ…

微软要求 Windows Insider 用户试用备受争议的召回功能

拥有搭载 Qualcomm Snapdragon 处理器的 Copilot PC 的 Windows Insider 计划参与者现在可以试用 Recall&#xff0c;这是一项臭名昭著的快照拍摄 AI 功能&#xff0c;在今年早些时候推出时受到了很多批评。 Windows 营销高级总监 Melissa Grant 上周表示&#xff1a;“我们听…

嵌入式Qt使用ffmpeg视频开发记录

在此记录一下Qt下视频应用开发的自学历程&#xff0c;可供初学者参考和避雷。 了解常用音频格式yuv420p、h264等了解QML&#xff0c;了解QVideoOutput类的使用&#xff0c;实现播放yuv420p流参考ffmpeg官方例程&#xff0c;调用解码器实现h264解码播放 不需要手动分帧。ffmpeg…

Web day02 Js Vue Ajax

目录 1.javascript: 1.js的引入方式&#xff1a; 2.js变量 & 数据类型 & 输出语句&#xff1a; 模板字符串&#xff1a; 3.函数 & 自定义对象&#xff1a; 4. json 字符串 & DOM操作&#xff1a; 5. js事件监听&#xff1a; 6.js的模块化导入或者导出&a…

Qt Graphics View 绘图实例

Qt Graphics View 绘图实例 这个实例程序实现如下功能&#xff1a; 可以创建矩形、椭圆、三角形、梯形、直线、文字等基本图形。每个图形项都可以被选择和移动。图形项或整个视图可以缩放和旋转。图形项重叠时&#xff0c;可以调整前置或后置。多个图形项可以组合&#xff0c;…

TCP socket api详解 续

文章目录 守护进程怎么做到&#xff1f;setsid返回值 dev/null字符文件 daemonTCP协议 退出的时候呢&#xff1f; 会话有很多后台任务&#xff0c;bash肯定会退&#xff0c;那后台会话怎么办呢&#xff1f; 理论上也要退的&#xff0c;但实际上关了bash&#xff0c;bash肯定要…

06_数据类型

数据类型 数据类型分类 JavaScript 语言的每一个值,都属于某一种数据类型。JavaScript 的数据类型,共有六种。(ES6 又新增了第七种 Symbol 类型的值和第八种 BigInt类型,当前课程暂不涉及) 据类型分类 原始类型(基础类型) var age = 20, var name = 尚学堂"; var le…

scrapy豆瓣爬虫增强-批量随机请求头

1.1 豆瓣爬虫增强,中间件随机请求头 1.2 清除原有的中间件,进行中间件测试 1.3 导入全新的中间件 1.4 运行爬虫,这个时候的请求头是固定的 1.5 强化对agent的输出,会舍弃输出cookie,使输出更明了 1.6 转移输出请求头位置 新增输出 造成这样问题的原因是Douban/Douban/settings…