C++ set 和 map学习

一、set(multiset)的基本知识和使用

 set也是一种我们直接可以使用的容器,使用应该包含 #include <set> 这个头文件。此处暂且不讨论其底层,只探讨set如何使用即可。

我们看到,set 的模板参数有三个,第一个就是其存储的数据类型,第二个是仿函数,决定到时候排序的逻辑,第三个是空间配置器,我们在使用中着重写第一个,而后两个我们目前的学习程度几乎用不到。

1. set的构造

我们可以看到,set的构造基本上和我们学的vector,list等容器的构造类似,因为set也是支持迭代器的,所以也是很简单的。

2. set的增删查

我们来看看下面的代码:

int main()
{set<int> s1;//set的插入s1.insert(4);s1.insert(1);s1.insert(9);s1.insert(5);for (auto a : s1){cout << a << " ";}cout << endl;auto found1 = s1.find(10);//找不到即返回end()if (found1 == s1.end())cout << "找不到" << endl;auto found2 = s1.find(5);s1.erase(found2);//支持迭代器删除s1.erase(4);//支持直接删除内容//注意,删除同样会导致迭代器失效for (auto a : s1){cout << a << " ";}cout << endl;return 0;
}

运行结果:

set在插入过程中,底层已经按照升序,将插入的内容排号顺序了,我们在删除的过程中,set仍然保持着升序。需要注意的是,当我们使用find功能时,如果没有查找到,则会返回set的end()迭代器。同样的,erase也支持迭代器区间删除,如果执行 erase(s1.begin(),s1.end()); 那么我们将删除set中所有的元素。

multiset和set的使用基本完全类似,因为set是不能接受相同的值的,也就是说我们如果插入了一个set中已经存在的值,那么我们会插入失败,而multiset不会插入失败,因为multiset支持值冗余。结果就是二者均会默认升序,而set会去重,multiset不会。

再是multiset中的find和erase功能,其中由于multiset会存在多个值,因此find返回的是其 中序第一个值得迭代器。而erase删除时,如果该值存在多个,erase会将其全部删除。

二、map的基本知识和使用

 这是map的声明,Key就是map底层关键字的类型,而T是map底层value的类型,同理set,一般情况下我们不需要传入后两个模板参数,只需要传入Key 和 T 即可。

1.pair类型

map的底层数据存储,是用pair<Key,T>来存储键值对数据。

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){}template<class U, class V>pair(const pair<U, V>& pr) : first(pr.first), second(pr.second){}
};

这就是pair的简单实现,我们从上面就可以看出来,pair内可以存储两个分别为T1 和 T2 类型的数据,而map的插入或者构造是需要pair的。

2. map的构造

还是一样,构造和前面没什么太大的区别,我们直接来看map的增删查改。

3.map的增删查

int main()
{map<string, string> m1;pair<string, string> p1("地图", "map");m1.insert(p1);m1.insert(pair<string, string>("你好", "hello"));m1.insert({ "自动的","auto" });for (auto a : m1){cout << a.first << "->" << a.second << endl;}return 0;
}

 运行结果:

map在插入过程中,会按照Key的大小进行自动排序,因此map一定程度上也可以帮助我们实现排序有关功能。

m1.erase("你好");
auto found = m1.find("地图");
cout << found->first << "->" << found->second << endl;
cout << endl;
for (auto a : m1)
{cout << a.first << "->" << a.second << endl;
}

运行结果如下:

也就是说,map的增删查和set基本一致,要注意的是map的插入是一个pair的类型,而删除和查找,只对map的Key有效,我们不能使用map的value来进行删除和查找。

4. map的[]功能样例

我们来看下面的代码:

int main()
{map<string, int> countMap;string arr[] = { "苹果","香蕉", "凤梨", "苹果", "猕猴桃", "香蕉", "苹果" };for (const auto& str : arr){countMap[str]++;}for (const auto& e : countMap){cout << e.first << ":" << e.second << endl;}//修改凤梨的个数countMap["凤梨"] = 20;cout << endl;for (const auto& e : countMap){cout << e.first << ":" << e.second << endl;}return 0;
}

运行结果如下:

这是我们一个统计水果个数的简单代码,通过map来实现,我们在下面也通过了[]来实现了修改map中Key值对应的value的数据,那么map中的[]该如何理解呢?

其实本质很简单,[]是运算符重载,如果map中没有[]中的Key值,例如上方在[]中写的str,那么我们就会插入该Key值,对应的value值是value所对类型的默认值,然后我们可以对该Key所对的value进行修改例如上方的++。如果Key已经存在,那么我们就只能对齐value进行修改,例如上方对凤梨个数的修改。

此时map中没有西瓜这个水果,也就是没有西瓜这个Key,那么我们只进行countMap["西瓜"];操作,会发生什么呢?完全正确,map会插入西瓜作为Key而其对应的value类型为int,其默认值为0,所以到时我们打印出来的就是 西瓜:0

以上内容如有错误,欢迎批评指正!

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【操作系统强化】王道强化一轮笔记

第一章 计算机系统概述 考点1 操作系统的概念、特征和功能 1. 2. 考点2 内核态与用户态 1. 2.用户态和内核态之间的切换本质上就是应用程序和操作系统对CPU控制器的切换 考点3 中断和异常 1. 2. 考点4 系统调用 1. 2. 3.C 考点5 操作系统引导 1. 2. ①磁盘的物理格式化&…

ERNIESpeed-128K在线智能聊天机器人项目(附源码)

本项目是基于百度千帆的智能聊天模型ERNIESpeed-128K开发的 一、技术栈 后端&#xff1a;java8springboot2.6.13 数据库&#xff1a;MongoDB 前端&#xff1a;vue2element-uimarked&#xff08;md格式&#xff09; 二、MongoDB与对话存储的设计 使用MongoDB来储存对话&am…

戎易大数据 | 数据分析实操篇:基于MySQL和Tableau的淘宝用户购物行为数据分析

本文来源公众号“戎易大数据”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;数据分析实操篇&#xff1a;基于MySQL和Tableau的淘宝用户购物行为数据分析 1项目介绍 为提高平台GMV和实现精细化运营&#xff0c;本项目首先使用My…

领夹麦克风哪个品牌好,无线领夹麦克风品牌排名,麦克风品牌大全

无线领夹麦克风因其便携性和隐蔽性&#xff0c;越来越受到演讲者和表演者的青睐。但是&#xff0c;随着市场上品牌和型号的增多&#xff0c;质量也变得参差不齐。许多用户在选购时&#xff0c;会因为缺乏了解而选择到性能不佳的产品&#xff0c;影响声音的清晰度和稳定性。下面…

预计2030年全球半导体用超高纯氢气市场规模将达到2.5亿美元

超高纯度氢气是半导体制造行业使用的关键气体&#xff0c;其纯度通常为 99.999% (5N) 或更高。这种纯度水平对于避免引入可能损害半导体器件性能和可靠性的杂质至关重要。在半导体生产中&#xff0c;超高纯度氢气用于化学气相沉积 (CVD)、外延生长、退火和表面清洁等关键工艺。…

java基础(2)方法的使用

目录 1.前言 2.正文 2.1方法的定义 2.2方法的调用过程 2.3方法的实参与形参 2.3.1形参 2.3.2实参 2.3.3参数传递 2.4方法的重载 3.小结 1.前言 哈喽大家好啊&#xff0c;今天博主继续带领大家学习java的基本语法&#xff0c;java的基础语法部分打算用六到七篇博文完…

Undet for sketchup 2023.3注册机 支持草图大师sketchup2021-2022-2023

1.Undet for sketchup 2023.3支持草图大师sketchup2021-2022-2023。支持机载雷达扫描、车载扫描还是地面扫描&#xff0c;对AEC行业用户来说&#xff0c;真正需要的是如何将这些数据快速处理为三维模型&#xff0c;这样才能将这些信息延展到BIM领域发挥效用。因此面对这些海量的…

Facebook开发者篇 - API拉取广告投放数据对接流程

大家好&#xff0c;我是牢鹅&#xff01;相信大家做出海&#xff0c;很多人会考虑在Facebook这样的大平台买量&#xff0c;但是每次登入Facebook的广告后台看数据很麻烦&#xff0c;又要科学上网&#xff0c;又要拉数据下来作进一步的分析&#xff0c;赚刀乐总是慢人一步。所以…

PHP基础语法讲解

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; PHP&#xff08;Hypertext Preprocessor&#xff09;是一种常用于网页开发的服务器端脚本语言&#xff0c;易于学习并且与 HTML 紧密结合。以下是 PHP 的基础语法详细讲解。 1. PHP 基础结构 1.1 PHP 脚本结…

kubernetes网络(二)之bird实现节点间BGP互联的实验

摘要 上一篇文章中我们学习了calico的原理&#xff0c;kubernetes中的node节点&#xff0c;利用 calico 的 bird 程序相互学习路由&#xff0c;为了加深对 bird 程序的认识&#xff0c;本文我们将使用bird进行实验&#xff0c;实验中实现了BGP FULL MESH模式让宿主相互学习到对…

Python练习宝典:Day 3 - 选择题 - 字符串与正则表达式、基础练习补充

目录 一、基础练习补充二、字符串与正则表达式 一、基础练习补充 1.下列能返回变量s的数据类型的是: A.print(type(s)) B.print(s) C.print(int(s)) D.print(str(s))2.如果想要换行,可以使用: A.\ B.\n C.\t D.\f3.合法的标识符是: A.M-N B.and C.Dior_Ysl D.6_friends4.在…

记一次:基于wmi软件的rpm包和deb包相互转换【附rpm和deb包】

1 背景 项目需要修改容器的基础镜像&#xff0c;从之前的CentOS 8 修改成 Ubuntu&#xff0c;项目中需要wmi包&#xff08;一个windows系统上管理和查询系统各种信息的工具&#xff0c;windows上自带&#xff09; 之前是使用rpm包进行安装的&#xff0c;现在使用的是deb的包管…

JBoss EJBInvokerServlet CVE-2013-4810 反序列化漏洞

开启环境 访问http://172.16.1.183:8080/invoker/EJBInvokerServlet下载下来了说明漏洞存在 利用生成的.ser文件&#xff0c;通过POST 二进制数据上去&#xff0c;反向连接shell curl http://192.168.10.154:8080/invoker/EJBInvokerServlet --data-binary ReverseShellCommon…

数据结构(Day19)

一、学习内容 单链表 头删 int front_dele(Plink L) {if(LNULL||L->len0){printf("头删失败\n");return -1;}Plink Q L->next;//保留要删除的1号节点L->next L->next->next;L->len--;free(Q);//释放空间QNULL;return 0; }尾删 int rear_dele(Pli…

每日一练:二叉树的最大深度

104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09; 一、题目要求 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7…

框架漏洞(5-rce s2-057 CVE-2017-8046 CVE-2018-1273 Shiro-550)

5-rce 步骤一&#xff1a;环境部署 cd vulhub/thinkphp/5-rce docker-compose up -d 步骤二&#xff1a;输入系统命令: whoami /index.php?sindex/think\app/invokefunction&functioncall_user_func_array&vars[0]system&vars[1][]whoami 步骤三&#xff1a;写…

常见的并发集合(java.util.concurrent)

1.CopyOnWriteArrayList 1.1 并发修改时保证线程安全: 通过ReentrantLock实现多个线程并发修改时的线程安全同步&#xff08;添加元素的同时&#xff0c;不允许删除&#xff09;添加新元素&#xff1a;list.add("")按照指定下标替换元素&#xff1a;list.set(index…

【Python调用ddddocr打包成exe文件指定模型库及注意事项】

ddddocr 打包成 exe 后一直存在各种各样的问题&#xff0c;例如&#xff1a; ddddocr\common.onnx failed. File doesn’t exist 查阅资料后&#xff0c;问题得到解决。但相关资料不多&#xff0c;且不够详细&#xff0c;特写下本文&#xff0c;以便于后来者解决问题。 希望本文…

java -----泛型

泛型的理解和好处 泛型是在JDK5之后引入的一个新特性&#xff0c;可以在编译阶段约束操作的数据类型&#xff0c;并进行检查。 泛型的格式为 <数据类型> import java.util.ArrayList;SuppressWarnings({"all"}) public class Generic02 {public static void…