13.3.3 map容器
使用map必须包括头文件<map>,map是一对对“关键字-值”的组合,“关键字”用于搜寻,而“值”用来表示要存储和取出的数据,在map容器对象中,每个关键字只能出现一次,或者说特定的关键字只能和一个值相关联。
为了方便对map和multimap进行增删处理,STL使用pair<class Type1,class Type2>类模板将两个类型Type1和Type2存储到一个对象中,如果keyword是关键字类型,value是被存储的数据类型,那么可以用下述指令生成map容器对象的一个元素t。
pair<const keyword,value>t(keydata,valuedata);也可以创建pair<const keyword,value>对象的匿名对象,调用格式如下所示。 pair<const keyword,value>(keydata,valuedata);
注意
const表明关键字是只读的,不可修改。
创建一个map容器对象的基本格式如下所示。
map<关键字类型,值类型[,排序函数或对象]>容器对象名;
排序函数或对象仍然是可选的,用以指定对关键字进行排序的函数或函数对象。同set及multiset一样,默认使用less<>模板,字面意义上可理解为从小到大进行排列。
由此可知map的创建方式同样有以下3种。
❑创建空map容器对象,如下所示。
map<int,string>obM;//关键字为int型,值为C++字符串string型❑将迭代器的区间作为参数的构造函数,如下所示。 pair<int,string>sz[4]={pair<int,string>(1,"Asia"),pair<int,string>(4,"Africa"), pair<int,string>(9,"Euro"),pair<int,string>(4,"America")}; map<int,string>obM(sz,sz+4);❑根据已有同类型的容器创建新容器,如下所示。 map<int,string>B(A);
map同样不支持下标随机访问的方式,必须通过类内迭代器对元素进行访问,如示例代码13.9所示。
代码13.9 map容器对象的创建和元素访问CreateAndMapContainer
<————————————文件名:example1309.cpp——————————————-> 01 #include<iostream> 02 #include<map>//使用map容器要包含的头文件 03 #include<string>//使用string类要包含的头文件 04 using namespace std; 05 int main() 06 { 07 //创建part<int,string>型数组 08 pair<int,string>sz[4]={pair<int,string>(9,"Asia"),pair<int,string>(4,"Africa"), 09 pair<int,string>(1,"Euro"),pair<int,string>(4,"America")}; 10 map<int,string>obM(sz,sz+4);//用迭代器区间构造obM 11 cout<<obM. size()<<endl;//输出obM中的元素个数 12 map<int,string>:iterator it=obM. begin();//创建map<int,string>模板类的 13 //迭代器,指向obM的头部 14 while(it!=obM. end())//按顺序逐个输出obM中的元素 15 { 16 cout<<(it). first<<":"<<(it).second<<endl; 17 it++; 18 } 19 return 0; 20 }
输出结果如下所示。
3 1:Euro 4:Africa 9:Asia
【代码解析】代码第8行的pair<int,string>类型的数组sz有4个元素,可map<int,string>容器对象中只有3个元素,这是因为pair<int,string>(4,"Africa")和pair<int,string>(4,"America")的关键字同为4,而map中不允许出现相同的关键字,所以后面一个pair被抛弃。
通过map<int,string>:iterator声明的类内迭代器的间接访问返回的pair<int,string>类型,在pair类模板中并没有对输出操作(<<)进行重载,所以要分别使用(it).first和(it).second形式输出pair模板类对象的第1个元素和第2个元素。
从输出结果可以看出,在obM创建时,对其中的元素自动进行了排列,由于程序中并没有显式指定要使用的比较函数或对象,所以采用了默认的less<>方式,按从小到大的顺序进行排列。