首页 > 其他分享 >4月18日set与map的学习

4月18日set与map的学习

时间:2023-04-18 23:23:06浏览次数:45  
标签:map set 函数 迭代 18 插入 pair

之前学习过string,list,vector,deque,和两种适配器queue和stack,这些都是线性表的数据结构;而今天学习的map和set他们的底层是二叉搜索树,或者平衡二叉搜索树。

首先是set她没有键值对,并且不能出现重复元素,比如当插入两个一时,他只会插入一个一,所以可以用作数组去重。

 比如上图当插入两个一时,只会在树中加入一个1而另一个插入失败,他与之前学习的容器一样,都有着增和删除的功能,但是他不可以改,因为他存的是常量,

std的命名空间中有一个find函数,而set类中也有一个find函数,但是他们是有所区别的,库里面的find函数是根据迭代器来查找的,而set中的find时利用他二叉搜索树的性质来找的,他们的效率不一样。相当于find库函数暴敛天物了。

set的删除函数有两种用法第一种是直接输入要删除的数据进行删除,这种删除若是没找到他就不会删除,也不知道删没删。而第二种时传入迭代器进行删除,用一个迭代器接受查找函数的返回值,进行删除,但若是没找到就会返回end函数,但是删除这个值会报错,所以可以在删除前加一个条件判断就可以了,

 且它也可以用迭代器去遍历。

 然后就是map类了,他与set不同的地方在于,它可以接受键值对,就是一个pair类这个类中有两个成员变量,可以理解为这俩个变量可以共同成为map的参数。所以map传参是这样子的:

 

 它也可以用迭代器去遍历,但是要输出可以用指针的解引用访问,也可以直接用指针去访问。

 这里有一个比较奇怪的地方之前也注意到过,就是迭代器的->运算符的重载,本应返回值为一个pair的指针所以他的使用应该是这样的:it->->first,但是上面却用一个指针成员变量访问符就可以访问,就比较奇怪。

这里迭代器的出现也就解释了为什么map要用一个类来封装两个变量了,因为一个迭代器不能有两个返回值。

然后还有一个make_pair函数,他是一个模板函数,用来构造pair类,他的返回值就是一个pair类,用来减少繁琐的pair匿名构造。

然后就是map的重载[]运算符了,这是最特殊的重载方括号运算符,他的参数传入是key_value而返回值是maped_value,并且还做了一系列操作;如下图:

 就一个方括号运算符就完成了数据的统计工作。

其实他的工作原理是调用了一个插入函数,并返回pair的second,就是说插入函数返回一个pair<iterator,bool>,然后对这个pair取first也就是iterator,这个iterator就是插入的位置的迭代器,然后对这个迭代器解引用得到一个pair,这个pair就是此结点的pair,然后返回这个pair的second,一上面为例,当使用方括号运算str是,系统自动调用插入函数,若插入成功,则初始化second为零,若插入失败就是bool值为false,就会返回已有str位置的second,若是对此值进行自增,就会出现上面那个情况。

 

标签:map,set,函数,迭代,18,插入,pair
From: https://www.cnblogs.com/qjwxlj/p/17331625.html

相关文章

  • 变编程一小时2023.4.18
    1.#include<iostream>usingnamespacestd;classShape{ public: virtualdoublearea()const=0;};classCircle:publicShape{ public: Circle(doubler):radius(r) { } virtualdoublearea()const { return3.14159*radius*radius; } protected: dou......
  • Contest 23-04-18
    #D.糖果镇思路\(m=3\)时整个路径有两个拐点,分别是\(m=1\tom=2,m=2\tom=3\)设拐点\(1\)在第\(i\)列,拐点\(2\)在第\(j\)列,则路径上的数字总和为\((front[1][i])+(front[2][j]-front[2][i-1])+(back[j])\)(\(front[i][j]\)表示第i行\(1\toj\)的前缀和,\(back[j]\)表......
  • 4月18日leetcode二叉树几种遍历方式的非递归和递归
    给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例1:二叉树的前序中序和后序遍历算法是学习二叉树必不可少的,若是使用c语言遍历前中后序还是比较繁琐的,因为要考虑遍历结果存放的序列大小问题,想要解决这个问题就得想用递归计算二叉树的节点数量,再调用递归子函数完......
  • 如何计算 目标检测任务的 AP 以及 mAP 指标?
    AP50:50的的意思是IOU的阈值是0.5。先算AP,AP是针对某一类的,表示不同置信度下的PR值的平均,也就是通过不同置信度得到一条PR曲线,曲线下的面积就是AP。这里的置信度是模型输出的条件概率,即是该类的条件下的概率。比如对于persion这一类,模型经过NMS得到一些......
  • java学习日记20230414-HashSet源码
    HashSetHashSet底层是HashMap添加一个元素时,先得到Hash值,会转化成索引值;找到存储数据表table,看这个索引位置是否存放元素;如果没有直接加入如果有,调用equals比较,如果相同放弃添加,如果不同,则添加到最后在java8中,如果一条链表的元素个数到达TREEIFY_THRESHOLD(默认是8)(table表......
  • 2023.4.18
    今天主要上了python课,我学了python,python好用,最恶心的一点就是代码风格问题,没用太多拘束,看着难受。晚上写了外包,实现了安卓pdf在线预览,通过安卓连接服务器来实现在线预览。 ......
  • Redis高级 哈希类型、列表类型、集合类型、有序集合(zset)、慢查询、pipeline与事务
    哈希类型###1---hget,hset,hdelhgetkeyfield#获取hashkey对应的field的value时间复杂度为o(1)hsetkeyfieldvalue#设置hashkey对应的field的value值时间复杂度为o(1)hdelkeyfield#删除hashkey对应的field的值时间复杂度为o(1)#测试hsetuser:1:infoage......
  • 【Redis】哈希类型 列表类型 集合类型 有序集合 慢查询 pipeline与事务 发布订阅 Bitm
    目录昨日回顾今日内容1哈希类型2列表类型3集合类型4有序集合(zset)5慢查询6pipeline与事务7发布订阅8Bitmap位图9HyperLogLog作业昨日回顾#1redis介绍 -特性#速度快:10wops(每秒10w读写),数据存在内存中,c语言实现,单线程模型#持久化:rdb和aof#多种数据结......
  • 4.18学习总结
    用户输入整数n(1<=n<=26)和整数m(m<=n),然后输入n个不同的字母,请编写程序输出在这n个字母中选择m个字母的所有排列序列和组合序列。【源代码程序】import itertools#输入a=input("请输入整数n和整数m的值:")a1=a.split("")for iin a1[::]:    if i=='':    ......
  • 2023 4 18
    1#include<iostream>2usingnamespacestd;3intmain(){4intnum=0;5inti,j,k;6for(i=0;i<4;i++){7for(j=0;j<4;j++){8k=8-i-j;9if(k<=6){10num++;11cout<<"time"<<num<......