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);