之前学习过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