map和set

目录

一、set

1、set的相关函数:

 2、set的使用

①、insert

②、erase

③、find 

④、count

3、关于multiset

①、insert区别

②、count的区别

③、find的区别

④、erase的区别

二、map

1、map的相关函数

2、map的使用

①、insert

 ②、find

③、[]

④、at

3、关于multimap


 

一、set

1、set的相关函数:

下面会挑选常用的进行用法示例

map和set_第1张图片

map和set_第2张图片

map和set_第3张图片

map和set_第4张图片

map和set_第5张图片

 2、set的使用

下面示范常用的几个函数

①、insert

首先插入几个值,用迭代器和范围for遍历结果打印

map和set_第6张图片

 map和set_第7张图片

set的结果有两个作用分别是排序和去重:

我们插入了5个数,其中有两个相同的,但是结果只有4个,说明有去重的作用

观察打印结果是升序的,原因是默认的仿函数是less,下图可见

map和set_第8张图片

默认排序为升序,是因为set的底层是搜索二叉树,而搜索二叉树的中序遍历就是升序的

如果想改为降序,只需在set后加greater即可,即set>(记得包头文件function)

这时范围for语法,也可以进行遍历 

map和set_第9张图片

如果支持迭代器,那就支持范围for,因为范围for的底层就是迭代器实现的

set并不支持改的操作

map和set_第10张图片

②、erase

为了方便观察,下面都用范围for遍历,删去了迭代器遍历的代码 

map和set_第11张图片

 map和set_第12张图片

直接删除指定的值

③、find 

find可以与erase结合使用。是由于下面的第一个重载,上面直接使用erase直接删除指定的值是第二个重载

map和set_第13张图片

例如我们想删除3,但是是传入3的位置进行删除的

map和set_第14张图片

map和set_第15张图片

注意需要判断pos是否与s.end()相等,不相等才能删除,因为若find没有找到输入的值,则返回s.end(),这时不判断是否等于s.end()直接删除有可能会出错

④、count

count可以检测该值在不在set中,存在返回1,否则返回0

map和set_第16张图片

 set中的count更多的还是为了和multiset保持接口的一致性

3、关于multiset

multiset与set的用法几乎一致,但是也有一些差别

multiset允许冗余,上面说到set的作用有去重,即插入两个相同的数时只会插入一个,而multiset允许插入两个相同的数

下面是两个插入时的区别:

①、insert区别

set:

map和set_第17张图片

multiset:

map和set_第18张图片

所以multiset作用就是单纯的排序,没有了去重的作用

②、count的区别

set是返回值只有1和0,而multiset会返回个数,如下:

map和set_第19张图片

插入的数有几个就返回几 

③、find的区别

map和set_第20张图片

如果find查找出现多次的相同数值,那么返回排序后的第一个数值的位置 

④、erase的区别

如果删除的是出现多次的数,那么会全部删除

map和set_第21张图片


二、map

1、map的相关函数

map和set的功能比较相似,有下面的一些函数

map和set_第22张图片

map和set_第23张图片

map和set_第24张图片

map和set_第25张图片

map和set_第26张图片

map和set_第27张图片

2、map的使用

map中是pair

map和set_第28张图片

①、insert

map和set_第29张图片

这里的insert插入的类型是value_type&,而value_type是pair结构体,如下图:

 而pair结构体中,里面有两个成员,一个是first,一个是second, 

所以map中insert插入的是一个结构体,而不是像set一样插入的是一个数

并且insert的返回值也是pair,这里是为下面的[]做准备的,因为[]的底层就是insert实现的,下面也会提到

下面就是map的insert的常规使用方法:调用构造插入

map和set_第30张图片

 打印结果也是根据第一个string内容的ASCII码排序的:

map和set_第31张图片

 第二种插入方法:make_pair

make_pair是函数模板,可以自动推出类型

map和set_第32张图片

map和set_第33张图片

 当然也可以用范围for遍历,加引用是担心拷贝代价太大

map和set_第34张图片

 ②、find

find这里的使用,统计出现的个数的样例,这里涉及的知识在二叉搜索树的key/value中也讲到过

第一种统计出现的个数的方法:

map和set_第35张图片

map和set_第36张图片

用于查找出现的次数,map的find和set的find类似,若没有找到则返回map的end(),所以使用前要先判断返回值是否等于end()

③、[]

[]是在map里找key(key和value就对应pair中的first和second)

若map中有这个key,则返回value的引用,这里就可以有查找和修改value的作用 

map和set_第37张图片

group中存在car,那么第一个group["car"]就是查找作用,有则返回car对应的value引用

第二个 group["car"] = "小汽车";就是修改的作用,因为返回的是value的引用,所以可以修改car的value值

如果map中没有这个key,那么就插入pair(key,V()),即调用默认构造,并返回value的引用,这里有插入和修改的作用

map和set_第38张图片

group["car"];是插入作用的体现

group["car"] = "小汽车";是查找加修改的作用体现

group["bus"] = "公交车";是插入加修改作用的体现

下面是第二种利用[]进行统计出现个数的方法:

map和set_第39张图片

map和set_第40张图片

其中的Count[cur]就是在Count中找与cur相等的key,若存在则++该key对应的int值,若没有则插入pair(cur,int()),调用默认构造,int默认为0,++int变为1

 []的底层其实就是使用的insert:

  insert的返回值描述:

意思就是若key已经在map中,返回pair(key_iterator,false) ,即已经存在结点的迭代器,bool为false

若key不在map中,返回pair(newkey_iterator,false) ,即新出现的key的迭代器,bool为true

下面是[]的底层的代码

中间的.first是insert的返回值pair的key_iterator或newkey_iterator,即该key值所在的结点的迭代器,接着解引用后.second是迭代器中的pair的second,即为所对应的value,满足了[]的返回值是value的引用

这里用到了两个pair,一个是insert的pair,一个是迭代器中的pair

上面图片的代码也可以写成:

pair ret = insert(make_pair(key,V())) ;

return ret.first->second;

④、at

at比[]功能少很多

map中存在key,则返回value引用

map中不存在key,则抛异常处理

map和set_第41张图片

3、关于multimap

multimap与map大致功能都差不多,但是没有[],因为multimap既然允许冗余,那么统计次数时,若插入多个相同的string值如:铅笔,无法确定到底返回哪个铅笔所对应的value值,所以multimap就不能解决统计次数的问题了

所以也有用multimap的场景,比如说一个单词有两个意思,那么插入两次这个单词,key相同,但是对应的value不相同,这个场景就能用multimap,但是使用的场景不多,大部分情况还是用map

其他用法参考set的multiset的用法,相差不大







你可能感兴趣的:(C++,c++)