mpa是一个键值对(key,value)序列容器, 其中key是唯一的,提供基于key的快速查询能力.属于标准关联式容器的一种.
元素插入过程是按排序规则插入,不能指定插入位置.
它不支持随机存取元素,不能使用数组[]和at方式进行访问.
map与multimap区别: map中key是唯一的,而multimpa中key可以出现多次
所需头文件:#include<map>
构造函数:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //map 2 map<int,string> mapA; //构造个空的map 3 map<int,string> mapB(mapA); //通过mapA拷贝构造一个map (mapB=mapA) 4 5 //使用迭代器构造 6 map<int,string> dIt(mapB.begin(),mapB.end()); //正向迭代器方式构造map 7 map<int,string> dRit(mapB.rbegin(), mapB.rend()); //反向迭代器方式构造map 8 9 //multimap 10 multimap<int,string> multimapA; //构造个空的multimap 11 multimap<int,string> multimapB(multimapA); //通过multimapA拷贝构造一个multimap (multimapB=multimapA) 12 13 //使用迭代器构造 14 multimap<int,string> dItM(multimapB.begin(), multimapB.end()); //正向迭代器方式构造multimap 15 multimap<int,string> dRiM(multimapB.rbegin(), multimapB.rend()); //反向迭代器方式构造multimap
增加元素操作:
注意:map元素中key是唯一的,无法插入相同key的元素. multiset中可以插入key重复的元素. 二种容器插入后都会自动进行排序
1. insert()方式插入,如果是map返回的是pair, 如果是multimap返回的是迭代器
使用pair方式插入 insert(pair<key,T>(key, T));
使用value_type方式插入 insert(map<key,T>::value_type(key,T));
2.数组方式插入 multimap不能使用数组方式插入
map对象[key] = T;
注意:使用数组方式时如果map中有相同的key,将会把key对应的值修改为新的值.
如果不确定key是否存在,使用insert()保险,如果确定key不存在使用数组方式方便些
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //map元素中key是唯一的,无法插入相同key的元素 2 map<int,string> mapA; 3 pair<map<int,string>::iterator,bool> pairRtn; 4 bool bInsertMap; 5 6 //1.通过pair方式插入 7 pairRtn = mapA.insert(pair<int,string>(0,"小王")); 8 bInsertMap = pairRtn.second; //bInserMap = true mapA={(0,"小王")} 9 10 //2.通过type_value方式插入 11 pairRtn = mapA.insert(map<int,string>::value_type(1,"小李")); 12 bInsertMap = pairRtn.second; //bInserMap = true mapA={(0,"小王"),(1,"小李")} 13 14 pairRtn = mapA.insert(map<int,string>::value_type(1,"大大")); 15 bInsertMap = pairRtn.second; //bInserMap = false //key己经存在,无法插入相同key的元素 16 //注意:前二种方式插入返回值都是一个pair对组,第一个参数是迭代器,第二个参数bool判断是否插入成功 17 18 //3.通过数组方式插入,注意:使用时如果map中有相同的key,将会把key对应的值修改为新的值 19 mapA[2] = "小张"; //mapA={(0,"小王"),(1,"小李"),(2."小张")} 20 mapA[2] = "小黄"; //此时因为己经有key为2的主键,就会直接修改原有键为2对应的值为小黄 21 //mapA={(0,"小王"),(1,"小李"),(2."小黄")} 22 23 //总结:如果不确定key是否存在,使用insert()保险,如果确定key不存在使用数组方式方便些
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //multimap中可以插入key重复的元素 2 multimap<int,string> multimapA; 3 multimap<int,string>::iterator itRtn; 4 5 //1.通过pair方式插入 6 itRtn = multimapA.insert(pair<int,string>(0,"小王"));//itRtn指向新插入元素(0,"小王") 7 8 //2.通过type_value方式插入 9 itRtn = multimapA.insert(map<int,string>::value_type(1,"小李"));//itRtn指向新插入元素(1,"小李") 10 itRtn = multimapA.insert(map<int,string>::value_type(1,"大大"));//itRtn指向新插入元素(1,"大大") 11 //注意:multimap二种方式返回的都是迭代器,而不是pair 12 13 //注意:multimap不能使用数组方式插入
删除元素操作:
注意:map元素中key是唯一的,所以删除时只会删除1个元素.multimap元素中key可以是重复的,所以根据key进行删除时只要相同的都会批量删除
erase() 如果参数是key,返回删除元素个数. 如果参数是爹代器,返回指向下个元素的迭代器
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //map中元素是唯一的,所以删除时只会删除1个元素 2 map<int,string> mapA; 3 mapA.insert(pair<int,string>(0,"小赵")); 4 mapA.insert(pair<int,string>(1,"小钱")); 5 mapA.insert(pair<int,string>(2,"小孙")); 6 7 size_t nCount = mapA.erase(1); //删除key为1的元素 mapA={0,"小赵"),2,"小孙")} nCount=1 8 map<int,string>::iterator itMap; 9 itMap = mapA.erase(mapA.begin()); //使用迭代器删除指向开始位置的元素 mapA={2,"小孙")} itMap指向下个元素 10 mapA.clear(); //清除所有元素
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //multimap中元素可以是重复的,所以根据key进行删除时只要相同的都会批量删除 2 multimap<int,string> multimapA; 3 multimapA.insert(pair<int,string>(0,"小赵")); 4 multimapA.insert(pair<int,string>(1,"小孙")); 5 multimapA.insert(pair<int,string>(0,"小钱")); 6 multimapA.insert(pair<int,string>(2,"小李")); 7 8 nCount = multimapA.erase(0); //删除key为0的元素 mapA={1,"小孙"),2,"小孙")} nCount=2 9 multimap<int,string>::iterator itMultiMap; 10 itMultiMap = multimapA.erase(multimapA.begin()); //使用迭代器删除指向开始位置的元素 mapA={2,"小孙")} itMap指向下个元素 11 multimapA.clear(); //清除所有元素
获取大小:
empty() 返回是否为空
size() 返回大小
max_size() 返回所能存储的最大元素个数,这是由系统自动定义的值
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //map 2 map<int,string> mapA; 3 bool bEmpty = mapA.empty(); //bEmpty = true 4 int nSize = mapA.size(); //nsize = 0 5 mapA.insert(map<int,string>::value_type(0,"小赵")); 6 bEmpty = mapA.empty(); //bEmpty = false 7 nSize = mapA.size(); //nSize = 1 8 int nMaxSize = mapA.max_size(); //nMaxSize = 89478485 所能存储的最大元素个数,这是由系统自动定义的值 9 10 //mulitmap 11 multimap<int,string> multimapA; 12 bEmpty = multimapA.empty(); //bEmpty = true 13 nSize = multimapA.size(); //nsize = 0 14 multimapA.insert(multimap<int,string>::value_type(0,"小赵")); 15 multimapA.insert(multimap<int,string>::value_type(0,"小钱")); 16 bEmpty = multimapA.empty(); //bEmpty = false 17 nSize = multimapA.size(); //nSize = 2 18 nMaxSize = multimapA.max_size(); 19 20 return;
查找操作:
find() 根据元素值进行查找,返回第一个找到的迭代器
count(key) 根据元素值进行查找,返回元素个数. 注意: map返回的只有可能是0或者1,而multimap返回的可能是0和>0的元素个数
lower_bound(elem) 返回第一个>=elem元素的迭代器
upper_bound(elem) 返回第一个> elem元素的迭代器
equal_range(elem) 返回容器中与elem相等的包含上下限二个迭代器的pair
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 map<int,string> mapStu; 2 mapStu.insert(pair<int,string>(3,"小张")); 3 mapStu.insert(pair<int,string>(1,"小李")); 4 mapStu.insert(pair<int,string>(5,"小王")); 5 mapStu.insert(pair<int,string>(7,"小赵")); 6 mapStu.insert(pair<int,string>(9,"小陈")); 7 //find(key); 根据key进行查找,返回找到的迭代器,若不存在,返回值等于map.end() 8 map<int,string>::iterator it = mapStu.find(3); 9 if(it != mapStu.end()) 10 { 11 cout<<"Ok,Find"<<endl; 12 }else 13 { 14 cout<<"Error,Find"<<endl; 15 } 16 17 //count(keyElem) //返回容器中key为keyElem的对组个数 18 //注意:对于map来说,要么是0,要么是1 19 //而multimap中键可以是重复的,所以count()值可以是0,或者>=1 20 int nCount = mapStu.count(99); //没有找到keyElem为99的元素,nCount=0 21 nCount = mapStu.count(3); //nCount = 1 22 23 //lower_bound(keyElem) 返回第一个>=keyElem元素的迭代器 24 //upper_bound(keyElem) 返回第一个> keyElem元素的迭代器 25 map<int,string>::iterator itLower = mapStu.lower_bound(5); // *itLower = 5 26 map<int,string>::iterator itUpper = mapStu.upper_bound(5); // *itUpper = 7 27 28 map<int,string>::iterator itLowerTwo = mapStu.lower_bound(6); // *itLowerTwo = 7 29 map<int,string>::iterator itUpperTwo = mapStu.upper_bound(6); // *itUpperTwo = 7 30 31 //equal_range(keyElem) 返回容器中与keyElem相等的包含上下限二个迭代器的pair 32 //pair是个对组,包含二个迭代器,first与second 33 //pair.first keyElem所在的迭代器 34 //pair.second keyElem所在的下一个迭代器 35 pair<map<int,string>::iterator, map<int,string>::iterator> itPair = mapStu.equal_range(5); 36 map<int,string>::iterator itFirst = itPair.first; // *itFirst = 5 37 map<int,string>::iterator itSecond = itPair.second; // *itSecond = 7 38 39 return;
排序操作:
和set一样可以使用自动排序,或者自己编写排序函数排序