【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.mzph.cn/pingmian/62310.shtml

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

相关文章

Python爬虫爬取数据报错

报错&#xff1a; Error fetching the URL: (Connection aborted., ConnectionResetError(10054, 远程主机强迫关闭了一个现有的连接。, None, 10054, None)) 报错原因&#xff1a; 目标服务器限制&#xff1a; 目标网站可能已经检测到你的请求来自自动化工具&#xff08;如爬虫…

【Linux】线程的互斥和同步

【Linux】线程的互斥和同步 线程间的互斥 临界资源&#xff1a;多线程执行共享的资源就叫做临界资源临界区&#xff1a;每个线程内部&#xff0c;访问临界资源的代码&#xff0c;就叫做临界区互斥&#xff1a;任何时刻&#xff0c;互斥保证有且只有一个执行流进入临界区&#…

抓包之查看http basic auth认证方式

写在前面 在这篇文章中我们看了http basic auth的认证方式&#xff0c;本文通过wireshark抓包的方式来验证http协议的交互过程。 1&#xff1a;正文 首先wireshark抓取本机回环地址&#xff08;具体看你服务情况&#xff0c;决定哪个网卡&#xff0c;我本地是运行在127的&am…

网络安全(1)_对称加密和非对称加密

1 网络安全概述 1.1 计算机网络面临的安全威协 &#xff08;1&#xff09;截获&#xff1a;攻击者从网络上窃听他人的通信内容&#xff0c;通常把这类攻击称为“截获”。在被动攻击中&#xff0c;攻击者只是观察和分析某一个协议数据单元&#xff08;PDU&#xff09;而不干扰信…

vmware中所有虚拟机都ping不通时解决方案

文章目录 1、报错内容&#xff1a;2、 报错原因&#xff1a;3、解决方案&#xff1a; 1、报错内容&#xff1a; 2、 报错原因&#xff1a; DNS解析错误。 一个虚拟机ping不通可能是网关配置问题&#xff0c;但我的网关配置也都没问题&#xff0c;而且我的所有虚拟机都ping不通…

智慧防汛平台在城市生命线安全建设中的应用

随着城市化进程的加快&#xff0c;城市基础设施的复杂性和互联性不断增强&#xff0c;城市生命线的安全管理面临前所未有的挑战。智慧防汛平台作为城市生命线安全建设的重要组成部分&#xff0c;通过现代信息技术提升城市防汛应急管理的智能化水平&#xff0c;保障城市安全。 …

自己整理的的java面试题

IO 按照流的流向分类&#xff1a;输入流和输出流 按照操作单元分类&#xff1a;可以分为字节流和字符流 按照流的角色划分&#xff1a;节点流和处理流 所有输入流的基类&#xff1a;InputStream/Reader 字节流/字符流 所有输出流的基类&#xff1a;OutputStream/Reader 字…

Android数据存储——文件存储、SharedPreferences、SQLite、Litepal

数据存储全方案——详解持久化技术 Android系统中主要提供了3中方式用于简单地实现数据持久化功能&#xff0c;即文件存储、SharedPreference存储以及数据库存储。除了这三种方式外&#xff0c;还可以将数据保存在手机的SD卡中&#xff0c;不给使用文件、SharedPreference或者…

DroneCAN 最新开发进展,Andrew在Ardupilot开发者大会2024的演讲

本文是Andrew演讲的中文翻译&#xff0c;你可以直接观看视频了解演讲的全部内容&#xff0c;此演讲视频的中文版本已经发布在Ardupilot社区的Blog板块&#xff0c;你可以在 Arudpilot官网&#xff08;https://ardupilot.org) 获取该视频&#xff1a; 你也可以直接通过Bilibili链…

(vue)启动项目报错The project seems to require pnpm but it‘s not installed

(vue)启动项目报错The project seems to require pnpm but it’s not installed 原因 该错误信息表明你的项目需要使用 pnpm 作为包管理工具&#xff0c;但系统中尚未安装 pnpm。 解决方法 【1】删除pnpm.lock 【2】npm install -g pnpm 之后再重新启动 yarn报错&#xff0…

【R安装】VSCODE安装及R语言环境配置

目录 VSCODE下载及安装VSCODE上配置R语言环境参考 Visual Studio Code&#xff08;简称“VSCode” &#xff09;是Microsoft在2015年4月30日Build开发者大会上正式宣布一个运行于 Mac OS X、Windows和 Linux 之上的&#xff0c;针对于编写现代Web和云应用的跨平台源代码编辑器&…

微信小游戏/抖音小游戏SDK接入踩坑记录

文章目录 前言问题记录1、用是否存在 wx 这个 API 来判断是微小平台还是抖小平台不生效2、微小支付的参数如何获取?3、iOS 平台不支持虚拟支付怎么办?微小 iOS 端支付时序图:抖小 iOS 端支付:4、展示广告时多次回调 onClose5、在使用单例时 this 引起的 bug6、使用 fetch 或…

Python 3 教程第24篇(输入和输出)

Python3 输入和输出 在前面几个章节中&#xff0c;我们其实已经接触了 Python 的输入输出的功能。本章节我们将具体介绍 Python 的输入输出。 输出格式美化 Python两种输出值的方式: 表达式语句和 print() 函数。 第三种方式是使用文件对象的 write() 方法&#xff0c;标准输…

ChatGPT的应用场景:开启无限可能的大门

ChatGPT的应用场景:开启无限可能的大门 随着人工智能技术的快速发展,自然语言处理领域迎来了前所未有的突破。其中,ChatGPT作为一款基于Transformer架构的语言模型,凭借其强大的语言理解和生成能力,在多个行业和场景中展现出了广泛的应用潜力。以下是ChatGPT八个最具代表…

尚硅谷学习笔记——Java设计模式(一)设计模式七大原则

一、介绍 在软件工程中&#xff0c;设计模式&#xff08;design pattern&#xff09;是对软件设计中普遍存在&#xff08;反复出现&#xff09;的各种问题&#xff0c;提出的解决方案。我们希望我们的软件能够实现复用性、高稳定性、扩展性、维护性、代码重用性&#xff0c;所以…

【iOS】知乎日报总结

文章目录 前言首页网络请求轮播图上滑加载图片请求 文章详情页WKWebView的使用点赞、收藏持久化——FMDB的使用 其他问题沙盒问题单元格点击其他 总结 前言 在系统学习了OC语言和UI控件后&#xff0c;知乎日报是第一个比较大的项目&#xff0c;耗时一个多月时间&#xff0c;里面…

网安瞭望台第6期 :XMLRPC npm 库被恶意篡改、API与SDK的区别

国内外要闻 XMLRPC npm 库被恶意篡改&#xff0c;窃取数据并部署加密货币挖矿程序 网络安全研究人员发现了一起在 npm 包注册表上活跃了一年多的软件供应链攻击。名为 0xengine/xmlrpc 的 npm 包最初是一个无害的库&#xff0c;基于 JavaScript&#xff0c;用于 Node.js 的 XML…

双向链表

目录 链表的分类 概念 双向链表的实现 ① 结构 ② 初始化 ③ 打印 ④ 插入数据 ⑤ 删除数据 ⑥ 查找数据 ⑦ 在pos位置之前插入数据 ⑧ 删除pos位置的数据 ⑨ 销毁链表 总结 链表的分类 虽然有这么多的链表的结构&#xff0c;但是我们实际中最常⽤还是两种结构&…

怎么样才算得上熟悉高并发编程?

提到并发编程很多人就会头疼了&#xff1b;首先就是一些基础概念&#xff1a;并发&#xff0c;并行&#xff0c;同步&#xff0c;异步&#xff0c;临界区&#xff0c;阻塞&#xff0c;非阻塞还有各种锁全都砸你脸上&#xff0c;随之而来的就是要保证程序运行时关键数据在多线程…

PyCharm中Python项目打包并运行到服务器的简明指南

目录 一、准备工作 二、创建并设置Python项目 创建新项目 配置项目依赖 安装PyInstaller 三、打包项目 打包为可执行文件 另一种打包方式&#xff08;使用setup.py&#xff09; 四、配置服务器环境 五、上传可执行文件到服务器 六、在服务器上运行项目 配置SSH解释…