set/multiset,map/multimap的使用与比较+pair介绍

set与multiset

    set跟priority_queue容器都把元素按照特定比较规则进行排序,他们的区别是:set在内部维护一棵红黑树,方便查询容器内的任一元素;priority_queue只能读取队头和队尾的元素,实际上只能找到容器内的最大最小元素,而且set是升序,priority_queue是头大尾小。

【特点】

①set容器保证每一次插入元素后容器内的元素都是有序的;

②set容器中的元素一经插入,不容修改,若想实现修改只能删除重插;

③访问set容器的元素只能采用间接方式,即迭代器;

④set容器不允许插入重复的元素;

⑤set容器的比较规则可以用重载小于号决定,也可以用自定义的比较函数。

【定义】

include<set>
using namespace std;
set<Type> a;

默认使用Type类型的小于号作为比较规则。

自己写比较函数的定义方法太麻烦,还得单独给比较函数建个类,不推荐。

【插入】

set插入元素使用insert函数,insert函数返回值是一个pair类型。

pair<set<Type>::iterator,bool> p = a.insert(b);
p.first;               //pair的first值为刚插入的b的位置
p.second;              //pair的second值表示是否插入成功,有重复值则会不成功
【删除】

set删除元素可以用erase函数删除特定元素,也可以用clear函数全部删除。

erase(value);          //移除set容器内元素值为value的所有元素,返回移除的元素个数
erase(&pos);           //移除pos位置上的元素,无返回值
erase(&first, &last);  //移除迭代区间[&first, &last)内的元素,无返回值
clear();               //移除set容器内所有元素,无返回值
这里的&pos,&first和&last都应该用迭代器。

【查找】

count(value);          //返回set对象内元素值为value的元素个数
find(value);           //返回value所在位置,找不到value将返回end()
multiset跟set的唯一区别就是,它允许容器内有重复元素存在。操作方法相同,定义时用multiset<Type> a,由于find只能找到一个元素,multiset应用迭代器配合count函数和find函数手动遍历容器寻找元素。

map与multimap

    map跟set的区别是:set容器存储元素的集合;map存储键值对集合。键就像字典中的词条,值则为对词条的解释,正如只有通过词条才能找到对应的解释,只有通过键才能找到对应的值。map容器内部同样维护着一棵红黑树,所以键值对是升序的,也很方便查询。

【特点】

①map容器保证每一次插入键值对后容器内的键值对都是有序的;

②map容器中的键值对一经插入,不容修改,若想实现修改只能删除重插;

③访问map容器的键值对只能采用间接方式,即迭代器;

④map容器不允许插入键重复的键值对;

⑤map容器的比较规则可以用重载小于号决定,也可以用自定义的比较函数。

【定义】

#include<map>
using namespace std;
map<KeyType,ValueType> m;

定义时第一个参数是键类型,第二个参数是值类型。

默认使用KeyType类型的小于号作为比较规则。

自己写比较函数的定义方法太麻烦,还得单独给比较函数建个类,不推荐。

【插入】

map插入数据时跟set的区别是,map插入的是键和值组成的pair类型数据而不是元素值。

①使用下标:

m[key] = value;        //如有重复的键,直接覆盖值
②使用insert函数:
pair<map<KeyType,ValueType>::iterator,bool> p = m.insert(make_pair(key,value));
p.first;               //pair的first值为刚插入的键值对的位置
p.first->first;        //刚插入的键值对的键
p.first->second;       //刚插入的键值对的值
p.second;              //pair的second值表示是否插入成功,有重复值则会不成功
make_pair函数顾名思义可以按参数返回一个pair型。

【删除】

map删除元素可以用erase函数删除特定元素,也可以用clear函数全部删除。

erase(key);            //移除map容器内键为key的所有键值对,返回移除的键值对个数
erase(&pos);           //移除pos位置上的键值对,无返回值
erase(&first, &last);  //移除迭代区间[&first, &last)内的元素,无返回值
clear();               //移除map容器内所有键值对,无返回值
这里的&pos,&first和&last都应该用迭代器。

【查找】

count(key);            //返回map对象内键为key的键值对个数
find(key);             //返回键为key的键值对的所在位置,找不到将返回end()
multimap跟map的唯一区别就是,它允许容器内有重复元素存在。操作方法相同,定义时用multimap<Type> m,由于find只能找到一个元素,multimap应用迭代器配合count函数和find函数手动遍历容器寻找元素。

【嵌套】

map中键值对的值部分也可以是另一个map容器,也就是说,如果需要,map可以无限嵌套下去。

map<KeyType,map<KeyType,ValueType> > m;
注意两个‘>’中间应该有空格,不然就连成了一个右移符号“>>”。

pair

【概述】

pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同,基本的定义如下:

pair<int, string> a;
表示a中有两个类型,第一个元素是int型的,第二个元素是string类型的,如果创建pair的时候没有对其进行初始化,则调用默认构造函数对其初始化。
pair<string, string> a("James", "Joy");
也可以像上面一样在定义的时候直接对其初始化。


由于pair类型的使用比较繁琐,因为如果要定义多个形同的pair类型的时候,可以时候typedef简化声明:

typedef pair<string, string> author;
author pro("May", "Lily");
author joye("James", "Joyce");

【pair对象】
对于pair对象,由于它只有两个元素,分别名为first和second,因此直接使用普通的点操作符即可访问其成员

pair<string, string> a("Lily", "Poly");
string name;
name = pair.second;

生成新的pair对象:
可以使用make_pair对已存在的两个数据构造一个新的pair类型:
int a = 8;
string m = "James";
pair<int, string> newone;
newone = make_pair(a, m);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值