• 组合使用容器可以获得比multimap更多的功能


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

  • 相关阅读:
    零知识证明,中间人攻击,盲签名:原理和应用——三篇密码学科普文章
    json
    优化自己的编写出来的C#程序
    C++中不同的继承方式
    C语言程序编写涉及内存的问题
    面向Android的Tesseract工具
    常见Linux使用的十大问题
    Java语言链接数据库连接池配置的两种技巧
    配置数据库连接池的技巧
    PHP和Java在Web开发下相比较
  • 原文地址:https://www.cnblogs.com/sjw1357/p/3864027.html
Copyright © 2020-2023  润新知