预备知识: map/multimap和set容器均会对键key进行排序。
1. multimap的一个键可以对应多个value,但是此value是不进行排序的。
multimap<int,int>中, 针对相同的key=1,添加1,2,3,1,1,1,1后,不进行排序,输出时为:1,2,3,1,1,1,1 。
#include <iostream>
#include <map>
using namespace std;
int main(){
multimap<int,int>iimm;
int key,value;
value=1;
iimm.insert(make_pair(1,value));
++value;
iimm.insert(make_pair(1,value));
++value;
iimm.insert(make_pair(1,value));
value=1;
iimm.insert(make_pair(1,value));
iimm.insert(make_pair(1,value));
iimm.insert(make_pair(1,value));
iimm.insert(make_pair(1,value));
typedef multimap<int,int>::iterator Iter;
Iter begin=iimm.lower_bound(1);
Iter end=iimm.upper_bound(1);
while(begin!=end){
cout<< begin->second <<endl;
++begin;
}
return 0;
}
此为输出结果:
2. 既然set容器可以对键值进行排序,那么如果使用map<int, set<int> > ,用value作为set的键值,就可以对value进行排序了
map<int,set<int>>中, 针对相同的key=1,每个value只可以添加一次,但是每个value是有序的,即 只有 1,2,3。
3. set<int> 每个value出现一次,不能完全反应输入结果,因此可以使用map<int,multiset<int>>
map<int,multiset<int>>,针对相同的key=1,每个value可以添加多次,且是已经排好序的:1,1,1,1,1,2,3
#include<iostream>
#include<map>
#include<set>
using namespace std;
int main(){
map<int,multiset<int> > m;
int value;
// 对map容器中key=1是的multiset<int> 进行插入
value=1;
m[1].insert(value);
++value;
m[1].insert(value);
++value;
m[1].insert(value);
value=1;
m[1].insert(value);
m[1].insert(value);
m[1].insert(value);
m[1].insert(value);
typedef map<int, multiset<int> >::iterator Iter;
Iter iter=m.find(1);//找到 key=1时第一个迭代器——注意:此迭代器为pair类型,first代表键值,second代表multiset<int>
if(iter!=m.end()){//如果该键存在,则只需对iter->second (即multiset<int>容器)进行读取,即可获得sorted value
multiset<int>::iterator iter2;
iter2=iter->second.begin();//<==> iter2= (iter->second).begin();
while(iter2!=iter->second.end()){
cout<< *iter2<<endl;
++iter2;
}
}
return 0;
}
此为其输出结果: