关联容器最大的特点就是通过键(key)存储和读取元素
pair类型也是一种摸板类型,包含两个元素。pair<T1,T2> p1(V1,V2)分别初始化为类型T1、T2,p1.first,p1.second分别返回first/second的元素。被用作map容器的键
map是键-值对的集合,map中元素为pair。map<k,v> m(b,e)创建map类型的对象m,存储迭代器b到e之间所有元素的副本,建和值类型分别为k,v。 map<k,v> m; map<k,v> m(m1)另两种构造函数。其中键值为const类型,不能改变
map定义的类型 map<k,v>::key_type 在map容器中,用作索引的键的类型 map<k,v>::mapped_type 在map容器中,键所关联的值的类型 map<k,v>::value_type一个pair类型。map类型的迭代器属于pair类型,对其解引用得到一个pair对象。
使用下标访问map对象:map <string,int> a; a["aaaa"]=1;先在a中寻找键为aaaa的元素,没有找到,创建一个新的键-值对加入a中,key=aaaa,关联的值为0;将其添加到a中,读取新插入的元素,并将其值赋为1。若map对象存在,下标返回的是键所关联的值。
m.insert(e) e是一个value_type类型的值。若e.first不在m中,添加这个新元素。若m键在m中已存在,则保持m不变。该函数返回一个pair类型对象,first便是一个指向e.first的迭代器,second返回bool值。若添加的元素不在容器中,bool为true
m.insert(beg,end) beg,end是m.value_type类型的迭代器,若其范围内的所有元素的键在m中不存在,则加入,返回void
m.insert(iter,e) e是m上的value_type类型的值。若e.first不在m,则创建,并以iter为起点搜索新元素储存的位置。返回一个指向m中具有给定键的元素
make_pair(a,b)可以直接创建一个pair类型 或者 typedef map<string,int>::value_type valtype; valtype(a,b)就直接创建了pair
pair<map<string,int>::iterator,bool> ret=a.insert(make_pair(word,1)); 分析++ret.first->second 当a中不含word时,返回值ret是pair型,ret.first是指向新加入的元素的迭代器,ret.second是bool=true;对ret.first解引用后成员first为新加入的元素的键值,second为其关联的值。(*(ret.first)).second和ret.first->second等同.
m.count(k) 返回m中k出现的次数 m.find(k) 如果m中存在按k索引的元素,则返回指向该元素的迭代器。若不存在,则返回超出末端迭代器end。可知count用来查找是否存在,find可用来读取。
从map对象中删除元素 e.erase(k) 删除m中键为k的元素,返回删除的元素个数。 e.erase(p)从m中删除迭代器p所指向的元素,这个元素必须存在,返回void
e.erase(b,e) 删除b,e间的元素 ,b所指向的元素必须在e所指向的元素之前,或者两者相等
set容器与map容器共享同样的构造函数 ,set中只存储键值。set.insert("a")返回一个迭代器和bool值的pair型对象 set.insert(a,b) a,b为迭代器,返回void
set.find()同样返回一个指向键的迭代器,set.count()返回数值。键值为const型,不能发生改变。
multiset和multimap类型允许一个键对应多个实例,他们所支持的操作分别与set和map相对应,除了multimap不支持下标运算。而且对于某个键值,要做好出个多个值的准备
insert操作总是添加一个元素,而带有一个键参数的erase版本将删除拥有该键的所有元素,并返回删除元素的个数。而带有迭代器的版本只删除指定的元素,并返回void
同一个键对应的几个实例,在容器中相邻存放
在multiset和multimap中寻找元素的方法:
1、find和count并用 先用find返回指向第一个匹配的实例的迭代器,用count得到实例的总数,然后遍历
2、m.lower_bound(k) 返回一个迭代器,指向键不小于k的第一个元素。 m.upper_bound(k) 返回一个迭代器,指向键大于k的第一个元素
m.equal_range(k) 返回一个迭代器的pair对象,它的first成员等价于m.lower_bound(k)。second等价于m.lower_bound(k)
对同一个键进行操作,就能得到一个迭代器范围,恰好就是所有的实例所在的范围
3、equal_range()返回一对迭代器的pair对象,若存在,第一个迭代器指向该值关联的第一个实例,第二个迭代器指向最后一个实例的下一个位置。若找不到,则两个迭代器都指向插入位置。