在将关联容器之前,我们首先了解都得是pair类型的数据。pair类型包含两个数据值,在创建pair类型的对象时,必须要提供两个类型名。即pair对象所包含的两个数据成员各自对应的类型名字。pair类型在utility的头文件中。
1.创建pair类型的对象:
pair<T1,T2>p1;创建一个空的pair对象,它的两个元素分别是T1和T2类型,采用值初始化。
pair<T1,T2>p1(v1,v2);创建一个pair对象,它的两个元素分别是T1和T2类型,其中first成员初始化为V1,second成员初始化为V2。
make_pair(V1,V2);以V1,V2值创建一个新的pair对象,其中元素类型分别是V1和V2的类型。
p1<p2;两个pair对象之间的小于运算。如果p1.first<p2.first 或者 !(p2.first<p1.first)&&p1.second<p2.second,则返回ture
p1==p2;如果两个pair对象的first和second成员一次相等,则这两个对象相等。
p.first 返回p中名为first的数据成员
p.second 返回p中名为second的数据成员
2.关联容器:map,set,multimap,multiset。
map类型:map是键-值对的集合。可以使用键作为下标来获取一个值,正如内置数组类型一样。而关联的本质在于元素的值与某个特定的键相关联,而并非通过元素在数组中的位置来获取。
(1)map对象的定义:
map<k,v>m;创建一个名为m的空map对象,其键和值的类型分别是K和V
map<k,v>m(m2);创建m2的副本m,m与m2必须有相同的键类型和值类型
map<k,v>m(b,e);创建一个map类型的对象m,存储迭代器b和e标记的范围内所有元素的副本。元素的类型必须能转换或者是pair<const K,V>
建类型的约束:在使用关联容器时,它的键不但有一个类型,而且还有一个相关的比较函数。默认情况下,标准库使用键类型定义的<操作符来实现键的比较。
(2)map定义的类型
map<k,v>::key_type 在map容器中,用做索引的键的类型
map<k,v>::mapped_type 在map容器中,用做键关联的值的类型
map<k,v>::value_type 一个pair类型,它的first元素具有const map<k,v>::key_type类型,而second元素则为map<k,v>::mapped_type类型
map迭代器进行解引用将产生pair类型的对象:如:
map<string,int>imap;
map<string,int>::iterator iter=imap.begin();
cout<<iter->first<<" "<<iter->second<<endl;
++iter;
3.给map容器添加元素:
在定义了map容器之后,下一步就是要添加元素了,map容器添加元素的方法主要有两种:一、采用下标的方法。二、利用插入(insert)
一、下标法:
map<string,int>imap; map<string,int>imap;
imap["liujiyu"]=1; string word;
while(cin>>word)
++imap[word];
下标法主要是通过相应的键来获取所关联的值,如果容器当中没有该键,则map将以该键以及该键所关联的值重新创建一个新的元素,并将它插入到map对象中。如果该键存在map容器中,则下标操作跟vector下标操作相同。
二、利用插入(insert)
map容器的insert成员。主要有以下几种形式:
m.insert(e); e是一个用在m上的value_type类型的值,即pair类型。如果(e.first)不在m中,则插入值为e.second的新元素;如果该键在m中已存在, 则保持m不变。 并且该函数返回一个pair类型对象,包含指向e.first的元素的map的迭代器和一个bool类型的对象,表示是否插入了该元素。
m.insert(beg,end); beg和end是标记元素范围的迭代器,其中的元素必须为m.value_type类型的键-值对。
m.insert(iter,e); e是一个用在m上的value_type类型的值,如果键(e.first)不在m中,则创建新元素,并以迭代器iter为起点搜索新元素存储的位置。返 回一个迭代器,指向m中具有给定键的元素。
例如:map<string,int>eords;
string word;
while(cin>>word)
{pair<map<string,int>::iterator,bool> it=words.insert(make_pair(word,1));
if(!it.second)++it.first->second;}
4.查找并且读取map中元素
m.count(k) 返回m中k出现的次数(这个k就是键)
m.find(k) 如果m容器中存在按k索引的元素,则返回指向钙元素的迭代器,如果不存在,则返回超出末端迭代器
5.map对象中删除元素:与插入操作类似
m.erase(k); 删除m中键位k的元素,返回size_type类型的值,表示删除的元素个数
m.erase(p); 从m中删除迭代器p所指向的元素。p必须指向m中确定存在的元素,而且不能等于m.end()。返回void类型。
m.erase(b,e); 从m中删除一段范围内的元素,该范围有迭代器对b和e标记。b和e必须标记m中的一段有效范围。返回类型为void