13.4 关联式容器支持的成员函数操作
同序列式容器一样,关联式容器同样支持插入、删除以及元素的查找和访问等通用操作,本节将针对上述3个方面分别进行介绍。
13.4.1 元素的插入
几种insert函数的描述如表13.2所示,其中ob代表关联式容器对象名,t对于set和multiset是个关键字,而对map和multimap是个pair结构。
下面对表13.2中所列函数进行简要的介绍。
1.pair<iterator,bool>ob.insert(t)
此函数适用于map和set容器,返回一个pair<iterator,bool>值,当ob中不包含与t有相同关键字的值时,将t插入ob中,bool的值为true;如果ob中已包含与t有相同关键字的值,不进行插入操作,bool的值为false,不论是否进行了插入操作,iteraotr都指向关键字与t相同的元素。
2.iterator ob.insert(t)
此函数适用于multimap和multiset容器,将t插入到ob中并返回指向其位置的迭代器。编号1和2的两个insert成员函数的用法如代码13.11所示。
代码13.11 将一个元素插入到关联式容器中AssociativeInsert1
<————————————-文件名:example1311.cpp——————————————> 01 #include<iostream> 02 #include<map>//使用map必须要使用的头文件 03 #include<string> 04 using namespace std; 05 int main() 06 { 07 //创建一个pair<int,string>数组sz 08 pair<int,string>sz[2]={pair<int,string>(1,"A"),pair<int,string>(2,"B")}; 09 pair<int,string>t(2,"X");//待插入的pair对象 10 map<int,string>obM(sz,sz+2);//基于sz创建map对象obM 11 map<int,string>:iterator itM=obM. begin();创建map<int,string>类内迭代器itM 12 //将t插入obM中,返回结果保存在pair<map<int,string>:iterator,bool>对象res中 13 pair<map<int,string>:iterator,bool>res=obM. insert(t); 14 if(res. second)//判断是否插入成功 15 cout<<"插入成功"<<endl; 16 else 17 cout<<"已包含关键字与t相同的元素:"<<(*res.first).second<<endl; 18 multimap<int,string>obDM(sz,sz+2);//基于sz创建multimap对象obDM 19 //创建multimap<int,string>类内迭代器 20 multimap<int,string>:iterator itDM=obDM. begin(); 21 itDM=obDM. insert(t);//执行插入操作 22 cout<<"插入的元素为:"<<(*itDM).second<<endl; 23 return 0; 24 }
输出结果如下所示。
已包含关键字与t相同的元素:B
插入的元素为:X
【代码解析】代码第13行是执行map容器的插入操作,而代码第21行是执行multimap容器的插入操作。
3.iterator ob.insert(p,t)
从迭代器p开始搜索应将t插入到ob中的位置,如下所示。
❑如果ob是map和set容器对象,只有当ob中不包含与t相同的关键字时,才进行插入,否则不进行插入。不论插入与否,返回的iterator都指向另外一个关键字与t相同的元素。
❑如果ob是multimap和multiset对象,将t插入到ob中并返回指向其位置的迭代器。p的作用是加快查找的速度。
4.void ob.insert(i,j)
i和j是一对输入迭代器,对map和set来说,i和j指向其关键字类型;对multimap和multiset来说,i和j指向pair<keyword,value>结构。此函数用以将区间[i,j]的元素插入到ob中,如示例代码13.12所示。
代码13.12 关联式容器插入一段区间AssociativeInsert2
<———————————-文件名:example1312.cpp———————————————> 01 #include<iostream> 02 #include<map>//使用map必须要使用的头文件 03 #include<string> 04 using namespace std; 05 int main() 06 { 07 //创建一个pair<int,string>数组sz 08 pair<int,string>sz[4]={pair<int,string>(7,"G"),pair<int,string>(3,"C"), 09 pair<int,string>(5,"E"),pair<int,string>(1,"A")}; 10 //创建一个pair<int,string>数组t 11 pair<int,string>t[4]={pair<int,string>(2,"B"),pair<int,string>(4,"D"), 12 pair<int,string>(6,"F"),pair<int,string>(1,"A")}; 13 map<int,string>obM(sz,sz+4);//基于sz创建map对象obM 14 obM. insert(t,t+4);//执行插入操作 15 for(map<int,string>:iterator itM=obM. begin();itM!=obM.end();itM++) 16 { 17 cout<<(itM). first<<""<<(itM).second<<endl; 18 } 19 cout<<"下面是multimap的插入操作:"<<endl; 20 multimap<int,string>obDM(sz,sz+4);//基于sz创建multimap对象obDM 21 obDM. insert(t,t+4);//执行插入操作 22 for(multimap<int,string>:iterator itDM=obDM. begin();itDM!=obDM.end();itDM++) 23 { 24 cout<<(itDM). first<<""<<(itDM).second<<endl; 25 } 26 return 0; 27 }
输出结果如下所示。
1 A 2 B 3 C 4 D 5 E 6 F 7 G下面是multimap的插入操作: 1 A 1 A 2 B 3 C 4 D 5 E 6 F 7 G
【代码解析】代码第14行演示了如何将一段区间插入到map,而代码第21行是将一段区间插入到multimap中,容器对象会根据插入元素的关键字对元素进行排序。
注意
相比map和multimap的用法,set和multiset要简单得多。不过4种关联式容器都会根据关键字对插入的元素进行排序处理。