set和map的使用

目录

1.关联式容器

2.键值对

3.set

3.1set的模版参数列表

3.2对set的修改

 3.2.1insert

3.2.2 erase

3.2.3clear

3.2.4swap

3.2.5 find

3.3set的迭代器

3.4set的容量

4.map

4.1对map的修改

4.1.1insert

 4.1.2erase

 4.1.3swap

4.1.4clear

4.2map的迭代器

 4.3operator[ ] 

4.4map容量查询 

4.5利用map统计个数的三种方法 

4.5.1方法一

4.5.2方法二

4.5.3方法三

5.multiset和multimap 


1.关联式容器

我们之前学的string,vector,deque,list等,其底层都是线性序列的数据结构,统称为序列式容器,里面存储的是元素本身。而set和map的底层是平衡搜索树,平衡搜索树中存储的是<key,val>结构的键值对,通过key才可找寻到存储的val,属于关联式容器。

相比序列式容器,关联式容器在数据检索时速度更快

2.键值对

键值对是一一对应的一种结构,里面存储着两个变量key和val,key代表键值,val表示的是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)
{}
};

通过阅读pair的源码我们发现,在pair中key被命名为first,val被命名为second。

3.set

set就类似我们之前学到的k型的搜索树,只存储val,但是其底层实际上也是存储着键值对,不过是<val,val>类型。

3.1set的模版参数列表

第一个参数代表着val的类型;compare:set中的元素默认按照小于来比较 ;alloc:set中元素的空间管理方式,采用的STL提供的空间进行管理

3.2对set的修改

 3.2.1insert

set<int> s;
s.insert(5);
pair<set<int>::iterator, bool> p = s.insert(10);
cout << p.second << endl; //输出1(true)
cout << *p.first;//输出iterator指向的10

3.2.2 erase

3.2.3clear

将set中的元素全部清空 

3.2.4swap

将两个set交换,实际上就是交换头节点。

void set_text2()
{set<int> s;s.insert(9);s.insert(8);s.insert(3);s.insert(2);set<int> s1;s1.insert(8);s1.insert(7);s1.insert(5);s1.insert(4);s1.insert(0);s1.swap(s);
}

3.2.5 find

根据要找的val值,如果有则返回其对应的迭代器,如果没有则返回迭代器end();与algorithm中的find的区别是,时间复杂度的区别。因为是二叉搜索树,所以这里的find时间复杂度是O(logN)

3.3set的迭代器

set也支持迭代器遍历和范围for遍历

set<int> s;
s.insert(9);
s.insert(8);
s.insert(3);
s.insert(2);
set<int>::iterator it = s.begin();
while (it != s.end())
{cout << *it << " ";++it;
}
cout << endl;
for (auto& x : s)
{cout << x << " ";
}

值得注意的是,它的遍历都是走的中序遍历,因此排出的是有序的,且能去重。因此set的一个功能就是排列和去重。

3.4set的容量

 值得注意的是,set中不允许修改它的val值,因为这可能会使二叉搜索树被破坏掉。

4.map

map的底层是KV模型,但是其节点是打包成pair键值对来进行存储的,pair中的first成员存储的就是key,pair成员的second存储的就是val值。我们是通过pair中的key来进行排序,查找的

4.1对map的修改

4.1.1insert

如图可以看见insert插入的其实是pair键值对,返回的也是一个pair键值对。如果插入成功那么返回的pair键值对的first存储的是成功插入位置pair的迭代器,second是bool值的1;如果插入失败,那么返回的pair健值对的first存储的是map中已经存储的相同key值的pair的迭代器,second是bool值的0。

map<int, int> m;
m.insert(pair<int, int>(1, 1));
m.insert(make_pair(2, 2));

上述的第一个插入实际上是一个匿名构造了一个pair,但过于复杂。我们通常用第二个make_pair模版函数进行构造,实际效果相同。

 4.1.2erase

 4.1.3swap

交换两个map的数据

4.1.4clear

清空一个map的所有数据

4.2map的迭代器

map支持迭代器就意味着它也支持范围for,迭代器中存储的实际上是pair键值对的指针

map<int, int> m;
m.insert(make_pair(1, 1));
m.insert(make_pair(2, 2));
m.insert(make_pair(3, 3));
m.insert(make_pair(4, 4));
m.insert(make_pair(5, 5));
m.insert(make_pair(8, 8));
m.insert(make_pair(10, 10));
map<int, int>::iterator it = m.begin();
while (it != m.end())
{cout << it->first << " " << it->second << endl;;++it;
}
cout << endl;
for (auto& x : m)
{cout << x.first << " " << x.second << endl;
}
cout << endl;

 4.3operator[ ] 

map中重载了operator[],如果传入的key值map中存在,则返回val的引用;如果传入的key不存在,则先insert,在返回默认的val。

其底层实现如下

   

operator[]的作用有插入,查找,修改val 

4.4map容量查询 

4.5利用map统计个数的三种方法 

例如一个string数组中存储了许多水果,统计不同水果重复出现的次数

4.5.1方法一

利用find查找判断是否在m内,如果不再则插入,在则++其second值

string s[] = { "苹果","香蕉","苹果","哈密瓜","凤梨","哈密瓜","苹果" };
map<string, int> m;
//方法一,利用find查找判断是否在m内,如果不再则插入,在则++其second值
for (auto& x : s)
{map<string, int>::iterator it = m.find(x);if (it == m.end()){m.insert(make_pair(x, 1));}else{it->second++;}
}

4.5.2方法二

利用insert的返回值进行操作

	string s[] = { "苹果","香蕉","苹果","哈密瓜","凤梨","哈密瓜","苹果" };map<string, int> m;for (auto& x : s){pair<map<string,int>::iterator,bool> p = m.insert(make_pair(x, 1));if (p.second == false){p.first->second++;}}

4.5.3方法三

利用operator[]

string s[] = { "苹果","香蕉","苹果","哈密瓜","凤梨","哈密瓜","苹果" };
map<string, int> m;
for (auto& x : s)
{m[x]++;//如果x在m中,就++其val值;如果x不再m中,先创建一个默认val值的pair,插入,然后++其val
}
for (auto& x : m)
{cout << x.first << " " << x.second << " ";
}

map中的key值是唯一的,不可修改。但是其val值并不是唯一的,且可修改

5.multiset和multimap 

set和map中的key值都是唯一的,而multiset和multimap中的key可以有重复的,但是mulitmap中没有重载operator[],因为可能有重复的key,那么就不知道该返回哪个val的引用

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

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

相关文章

【5.10】指针算法-快慢指针将有序链表转二叉搜索树

一、题目 给定一个单链表&#xff0c;其中的 元素按升序排序 &#xff0c;将其转换为 高度平衡的二叉搜索树 。 本题中&#xff0c;一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。 示例: 给定的有序链表&#xff1a; [ -10 , -3 , 0 , …

dns服务器配置

主服务器 1.挂载点 mount /dev/sr0 /mnt 2.防火墙关闭 systemctl stop firewalld setenforce 0 3.下载bind软件 dnf install bind -y 4.进行正向解析配置 vim /etc/named.conf options { listen-on port 53 { 192.168.92.128; }; directo…

stable diffusion图生图

本节内容&#xff0c;给大家带来的是stable diffusion的图生图课程&#xff0c;我们在midjourney的课程中有学习过midjourney的图生图功能&#xff0c;即使用垫图的方式来引导AI绘制图片。图生图是AI绘图程序一个非常重要的功能&#xff0c;stable diffusion同样提供了类似的功…

论文阅读笔记:DRCT: Saving Image Super-Resolution away from Information Bottleneck

论文阅读笔记&#xff1a;DRCT: Saving Image Super-Resolution away from Information Bottleneck 1 背景1.1 问题1.2 本文提出的方法 2 创新点3 方法4 模块4.1 问题描述4.2 深度特征提取模块4.3 同任务渐进式训练策略 5 效果5.1 和SOTA方法对比 论文&#xff1a;https://arxi…

一周内从0到1开发一款 AR眼镜 相机应用?

目录 1. &#x1f4c2; 前言 2. &#x1f4a0; 任务拆分 2.1 产品需求拆分 2.2 开发工作拆分 3. &#x1f531; 开发实现 3.1 代码目录截图 3.2 app 模块 3.3 middleware 模块 3.4 portal 模块 4. ⚛️ 拍照与录像 4.1 前滑后滑统一处理 4.2 初始化 View 以及 Came…

【论文精读】LPT: Long-tailed prompt tuning for image classification

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;论文精读_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 摘要 2. …

《重学Java设计模式》之 建造者模式

建造者模式所完成的内容就是通过将多个简单对象通过一步步的组装构建出一个复杂对象的过程 模拟装修公司对于设计出一些套餐装修服务的场景。 很多装修公司都会给出自家的套餐服务&#xff0c;一般有&#xff1b;豪华、轻奢、简约等&#xff0c;这些套餐的后面是不同的商品的…

Android Framework AMS(12)广播组件分析-3(广播发送流程解读)

该系列文章总纲链接&#xff1a;专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节主要解读广播组件的广播发送过程。关注思维导图中左上侧部分即可。 有了前面广播组件 注册和注销程分析的基础&#xff0c;基于此&#xff…

MongoDB笔记02-MongoDB基本常用命令

文章目录 一、前言二、数据库操作2.1 选择和创建数据库2.2 数据库的删除 3 集合操作3.1 集合的显式创建3.2 集合的隐式创建3.3 集合的删除 四、文档基本CRUD4.1 文档的插入4.1.1 单个文档插入4.1.2 批量插入 4.2 文档的基本查询4.2.1 查询所有4.2.2 投影查询&#xff08;Projec…

MySQL基础-单表查询

语法 select [distinct] 列名1&#xff0c;列名2 as 别名... from数据表名 where组前筛选 group by分组字段 having组后筛选 order by排序的列 [asc | desc] limit 起始索引&#xff0c;数据条数 测试数据 # 建测试表 create table products (id int primary key a…

【pycharm jupyter】远程开发 启动报错

报错信息 upyter server process exited with code 1 ServerApp] A _jupyter_server_extension_points function was not found in jupyter_lsp. Instead, a _jupyter_server_extension_paths function was found and will be used for now. This function name will be depre…

CPU Study - Instructions Fetch

参考来源&#xff1a;《超标量处理器设计》—— 姚永斌 N-Way CPU 取指问题 如果CPU可以在每个周期内同时解码N条指令&#xff0c;则此类CPU为N-Way超标量处理器。 N-Way超标量处理器需要每个周期从I-Cache中至少取得N条指令&#xff0c;这N条指令成为一组Fetch Group。 为了…

掌握 PyQt5:从零开始的桌面应用开发

PyQT5——图形化界面 文章目录 PyQT5——图形化界面集成化图形界面工具为什么使用 \$ProjectFileDir$?示例场景其他 Varaiablespyuic参数解释整体含义示例使用PyQt5和pyuic 创建pyqt5的程序创建一个窗口app.exec\_()和sys.exit(app.exec_())的区别1. app.exec_()2. sys.exit(a…

论文阅读笔记:Image Processing GNN: Breaking Rigidity in Super-Resolution

论文阅读笔记&#xff1a;Image Processing GNN: Breaking Rigidity in Super-Resolution 1 背景2 创新点3 方法4 模块4.1 以往SR模型的刚性4.2 图构建4.2.1 度灵活性4.2.2 像素节点灵活性4.2.3 空间灵活性 4.3 图聚合4.4 多尺度图聚合模块MGB4.5 图聚合层GAL 5 效果5.1 和SOTA…

PMP–一、二、三模、冲刺–分类–7.成本管理–技巧–挣值分析

文章目录 技巧一模7.成本管理--4.控制成本--数据分析--挣值分析--进度绩效指数&#xff08;SPI&#xff09;是测量进度效率的一种指标&#xff0c;表示为挣值与计划价值之比&#xff0c;反映了项目团队完成工作的效率。 当 SPI小于 1.0 时&#xff0c;说明已完成的工作量未达到…

保姆级教程!!教你通过【Pycharm远程】连接服务器运行项目代码

小罗碎碎念 这篇文章主要解决一个问题——我有服务器&#xff0c;但是不知道怎么拿来写代码&#xff0c;跑深度学习项目。确实&#xff0c;玩深度学习的成本比较高&#xff0c;无论是前期的学习成本&#xff0c;还是你需要具备的硬件成本&#xff0c;都是拦路虎。小罗没有办法…

成绩管理系统软件体系结构设计

成绩管理系统软件体系结构设计 文档简介 1.1 目的 1.2 范围 1.3 定义、首字母缩写词和缩略语 1.4参考资料 1.5 概述体系结构表示方式软件体系结构的目标和约束 3.1 结构清晰 3.2 支持外包开发 3.3 可扩展性 3.4 系统安全性 3.5 可移植性 4体系结构模式逻辑视图进程视图…

单臂路由实现不同VLAN之间设备通信

转载请注明出处 本实验为单臂路由配置&#xff0c;目的为让不同VLAN之间的设备能够互相通信。 1.首先&#xff0c;按照要求配置两个pc的ip地址&#xff0c;以pc0为例子&#xff1a; 2在交换机创建vlan10和vlan20 3.划分vlan&#xff0c;pc0为vlan10的设备&#xff0c;pc1为vla…

机器学习(三)——决策树(附核心思想、重要算法、概念(信息熵、基尼指数、剪枝处理)及Python源码)

目录 关于1 基本流程2 划分属性的选择2.1 方法一&#xff1a;依据信息增益选择2.2 方法二&#xff1a;依据增益率选择2.3 方法三&#xff1a;依据基尼指数选择 3 剪枝处理&#xff1a;防止过拟合3.1 预剪枝3.2 后剪枝 4 连续与缺失值4.1 连续值处理4.2 缺失值处理 5 多变量决策…

Ubuntu和Debian系列的Release默认shell解释器变更

Debian 12 Bookworm 和 Ubuntu 24.04 中默认的 shell 解释器已经由 bash 变更为了 dash 。 这个变化对于我们直接在 CLI 上执行 Linux command 无影响&#xff0c;但对于执行shell解释性程序有影响&#xff0c;已知 bash 中的 变量正规表达式 &#xff08;如 ${GIT_COMMIT:0:8…