预备知识: 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; }此为其输出结果: