精华内容
下载资源
问答
  • map容器中所有元素都是对组(pair),pair中第一个元素为键值(key)起到索引作用,第二个元素为实值(value),并且所有的元素都会根据元素的键值自动排序。 区别: map 不允许容器中有重复的key值元素 multimap 允许...

    C++: map/multimap容器按照自定义规则进行排序

    1、map/multimap容器简介

    定义:
    map容器中所有元素都是对组(pair),pair中第一个元素为键值(key)起到索引作用,第二个元素为实值(value),并且所有的元素都会根据元素的键值自动排序。

    区别:

    • map 不允许容器中有重复的key值元素
    • multimap 允许容器中有重复的key值元素

    本质: map/multimap属关联式容器,底层结构由二叉树来实现的。

    2、map容器自定义排序示例

    问题描述

    给定6个人的信息,即:姓名、年龄、身高、体重。要求排序规则为:首先按照年龄进行升序排列,然后在年龄相同的情况下按身高进行升序排列,最后在身高相同的情况下按照体重进行升序排列。

    例如,编写程序,打印如下表所示信息:

    姓名 年龄 身高(cm) 体重 (Kg)
    李白 18 180 55
    光头强 20 170 45
    哪吒 20 170 65
    铁蛋 20 170 66
    二狗子 20 170 70
    孙悟空 20 175 60

    3、map容器自定义排序程序

    #include<iostream>
    #include<map>
    using namespace std;
    
    class Person //创建Person类
    {
    public:
    	Person(string name, int age, int height,int weight)
    	{
    		this->m_name = name;
    		this->m_age = age;
    		this->m_height = height;
    		this->m_weight = weight;
    	}
    	string m_name;
    	int m_age;
    	int m_height;
    	int m_weight;
    };
    
    
    class MyCompare //自定义排序规则
    {
    public:
    	bool operator () (const Person& p1, const Person& p2)const  //自定义排序规则:首先按年龄升序排,年龄相同情况下按身高升序排
    	{
    		if (p1.m_age == p2.m_age)
    		{
    			if (p1.m_height == p2.m_height)
    			{
    				return p1.m_weight < p2.m_weight;
    			}
    			else
    			{
    				return p1.m_height < p2.m_height;
    			}
    		}
    		else
    		{
    			return p1.m_age < p2.m_age;
    		}
    	}
    
    };
    
    
    void test()
    {
    	//默认从小到大排序
    	//利用仿函数实现从大到小排序
    	
    	multimap<Person,int, MyCompare> m; //注意此处用的是mltimap,因为map不允许插入重复的值存在,例年龄相同的元素只会存在一个
    
    
    	Person p1("孙悟空", 20, 175,60);
    	Person p2("哪吒", 20, 170,65);
    	Person p3("二狗子", 20, 170,70);
    	Person p4("李白", 18, 180,55);
    	Person p5("光头强", 20, 170,45);
    	Person p6("铁蛋", 20, 170,66);
    
    	m.insert(make_pair(p1,1));
    	m.insert(make_pair(p2,2));
    	m.insert(make_pair(p3,3));
    	m.insert(make_pair(p4,4));
    	m.insert(make_pair(p5,5));
    	m.insert(make_pair(p6,6));
    	
    	for (map<Person,int, MyCompare>::iterator it = m.begin(); it != m.end(); it++)
    	{
    		cout << " 姓名:" << it->first.m_name << " \t年龄:" 
    		<< it->first.m_age << " \t身高:" << it->first.m_height
    		<< " \t体重:" << it->first.m_weight <<endl;
    	}
    	
    }
    
    int main()
    {
    	test();
    	system("pause");
    	return 0;
    }
    
    

    程序运行结果:

    程序运行结果

    4、总结

    重点在于:multimap<Person,int, MyCompare> m; ,自定义的Person类需要放置在map的key值处,这样再写遍历语句:for (map<Person,int, MyCompare>::iterator it = m.begin(); it != m.end(); it++) 时,自定义的排序规则MyCompare才会对Person中的参数值(其实被当作的索引了)进行索引、排序。

    若写成for (map<int,Person,MyCompare>::iterator it = m.begin(); it != m.end(); it++)会报错!

    展开全文
  • C++ STL--map容器

    2017-06-16 22:43:27
    map容器 介绍: 提供一个键--值对容器,表示了一个一对一的关系(可以想象数组下标与该位置元素的对应关系),map(映射)与multimap(多重映射)差别在于multiple允许一个键对应多个值。  头文件: #include  ...

    map容器

    介绍:

    提供一个键--值对容器,表示了一个一对一的关系(可以想象数组下标与该位置元素的对应关系),map(映射)与multimap(多重映射)差别在于multiple允许一个键对应多个值。 

    头文件:

    #include   <map> 

    定义:

     map<string,   int>   mymap; 

    一些基本操作:

    插入内容:
      (1)   mymap ["a"]   =   1; 
      (2)   mymap.insert(map<string,   int>::value_type("b",2)); 
      (3)  mymap.insert(pair<string,int>("c",3)); 
     

    可以由string键来查找,赋值

    键本身是不能被修改的,不会重复的

    删除数据:

      mymap.erase("c"); 

    其它方法 :
      mymap.size()               返回元素数目 
      mymap.empty()       判断是否为空 
      mymap.clear()           清空所有元素 

    迭代器见示例:

    示例实现了对输入空格分隔的字符串(可以理解为单词)的计数;



    #include 
    #include
    using namespace std;
    
    int main()
    {
        mapmymap;
        map::iterator it;
        string temp;
        while(cin>>temp&&temp!="EOF")//
            mymap[temp]++;
        for(it=mymap.begin();it!=mymap.end();it++)
            cout<first<<" "<second<
    输入:

    输出:


    为了实现快速查找,map内部本身就是按序存储的(比如红黑树)。在我们插入<key, value>键值对时,就会按照key的大小顺序进行存储。这也是作为key的类型必须能够进行<运算比较的原因。

    别人的讲排序的链接

    点击打开链接

    判断map是否包含一个键,是用map的find方法,判断find的返回结果是否是map的end
    if(m.find(1)==m.end())
            cout<<"no key find"<<endl;
        else
            cout<<"key find";
    
    还有人会用map[key]==0的方法,这有一些问题:
    看示例:
    #include <iostream>
    #include <map>
    using namespace std;
    
    
    int main()
    {
        int n,key,val;
        map<int, int > m;
        if(m.find(1)==m.end())
            cout<<"no key find"<<endl;
        else
            cout<<"key find";
        if(!m[1])
        {
            if(m.find(1)!=m.end())
            cout<<"key find"<<endl;
        }
        if(m.find(1)!=m.end())
            cout<<"key find"<<endl;
    }
    
    输出:
    为啥呢?开始找不到,之后又找到了?关键在于map下标的使用
    
    在map查找这个键值的项,map如果不包含某个键值,会返回map的end,然后它发现此键值没有找到的话,会自动在末尾插入一个以你输入的键值([]中的内容)和value的默认值构成的对,然后返回这个插入项的值(first,second,),而int的默认构造函数int(),就是0。
    
    但有时,这样的使用是有利的,只要弄清就好;
    一个合并数据表记录,包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算;
    此时,采用如下方法添加表项是十分方便的,该方式细节并不是无目标创建,有对应键,相加;最终实现是对的,但细节不是;导致如果是计数,该实现有可能不对;实现见第一段代码
            if(!m[key])//两种情况:key存在,值为0,key不存在,自动创建,值为0;最终都会对表内对应key,值为0的项赋值;
                m[key]=val;
            else
                m[key]+=val;
    
    
    有两种方式进行数据的插入,第一种是使用下标的方式,也就是[],第二种是使用insert接口,它们主要的区别如下:
    下标的方式插入,如果原本key不存在则会先创建对应的记录,然后再进行赋值,即如果存在,会改变值哦;
    insert方式插入,如果key不存在,则插入记录,如果存在则什么都不做。如:m.insert(pair<int ,int >(1,2));

    
    

    
    

    展开全文
  • C++map容器

    2016-12-05 12:18:56
    C++map容器提供一个键值对容器,map与multimap差别仅仅在于multiple允许一个键对应多个值。  一、map的说明   1 头文件   #include     2 定义   map my_Map;   或者是typedef map MY_MAP...

    C++中map容器提供一个键值对容器,map与multimap差别仅仅在于multiple允许一个键对应多个值。   

    一、map的说明  
      1   头文件 
      #include   <map> 
      
      2   定义 
      map<string,   int>   my_Map; 
      或者是typedef     map<string,   int>   MY_MAP; 
      MY_MAP   my_Map; 
      
      3   插入数据 
      (1)   my_Map["a"]   =   1; 
      (2)   my_Map.insert(map<string,   int>::value_type("b",2)); 
      (3)   my_Map.insert(pair<string,int>("c",3)); 
      (4)   my_Map.insert(make_pair<string,int>("d",4)); 
      
      4   查找数据和修改数据 
      (1)   int   i   =   my_Map["a"]; 
                my_Map["a"]   =   i; 
      (2)   MY_MAP::iterator   my_Itr; 
                my_Itr.find("b"); 
                int   j   =   my_Itr->second; 
                my_Itr->second   =   j; 
      不过注意,键本身是不能被修改的,除非删除。 
      
      5   删除数据 
      (1)   my_Map.erase(my_Itr); 
      (2)   my_Map.erase("c"); 
      还是注意,第一种情况在迭代期间是不能被删除的,道理和foreach时不能删除元素一样。 
      
      6   迭代数据 
      for   (my_Itr=my_Map.begin();   my_Itr!=my_Map.end();   ++my_Itr)   {} 
      
      7   其它方法 
      my_Map.size()               返回元素数目 
      my_Map.empty()       判断是否为空 
      my_Map.clear()           清空所有元素 
      可以直接进行赋值和比较:=,   >,   >=,   <,   <=,   !=   等等 
      
      更高级的应用查帮助去吧,^_^;

    二/map的举例

    要求: 将mymap中itemstruct   的a大于100的项删除  
    struct   itemstruct 
      { 
                int   a; 
                char   b[20]; 
      }; 
      map<string,   itemstruct   >     mymap. 
      
    解答1:
      #include   <iostream> 
      #include   <ctime> 
      #include   <map> 
      using   namespace   std; 
      typedef   struct   itemstruct 
      { 
                int   a; 
                char   b[20]; 
      }itemS; 
      itemS   s[4]   =   {{102,"what"}, 
                              {33,   "hello"}, 
                              {198,"world"}, 
                              {45,   "c++"} 
                          };; 
      
      
      int     main() 
      { 
                map<string,   itemS>     mymap; 
                string   str[4]   =   {"1st","2nd","3rd","4th"}; 
                for(int   i   =   0;   i<4;   i++) 
                { 
                     mymap.insert(make_pair(str[i],   s[i])); 
                } 
                
                map<string,itemS>::iterator   it; 
                for(it=mymap.begin();   it!=mymap.end(); it++) 
                { 
                   if(it->second.a >100){ 
                      i=mymap.erase(it);  ----->正确
        mymap.erase(it);     ----->it失效..
            }
                }
      //first是Key, second是value;
                for(it = mymap.begin();  it!=mymap.end(); it++) 
                { 
                              cout<<it->first<<"   "<<it->second.a<<"   "<<it->second.b<<endl; 
                } 
              system("pause"); 
              return   0; 
      }

    解答2:
    #include<map> 
      #include<iterator> 
      #include<string> 
      #include<iostream> 
      #include<cstring> 
      using   namespace   std; 
      struct   itemstruct 
      { 
                int   a; 
                char   b[20]; 
                itemstruct(int   t,char*str) 
        { 
        a=t; 
        strcpy(b,str); 
        } 
      }; 
      int   main() 
      { 
      map<string,itemstruct>mymap; 
      mymap.insert(make_pair("a",itemstruct(10,"hanzhou"))); 
      mymap.insert(make_pair("ab",itemstruct(20,"fuzhou"))); 
      mymap.insert(make_pair("abc",itemstruct(30,"zhengzhou"))); 
      mymap.insert(make_pair("abcd",itemstruct(200,"wuhan"))); 
      mymap.insert(make_pair("abcde",itemstruct(150,"kunming"))); 
      mymap.insert(make_pair("abcdef",itemstruct(50,"xiamen"))); 
      map<string,itemstruct>::iterator   it=mymap.begin(); 
      while(it!=mymap.end()) 
      { 
      if((it->second).a>100)mymap.erase(it++); 
      else   it++; 
      } 
      it=mymap.begin(); 
      while(it!=mymap.end()) 
      { 
      cout<<it->first<<"   "<<(it->second).a<<"   "<<(it->second).b<<endl; 
      it++; 
      } 
      system("PAUSE"); 
      return   0; 
      }

    解答3:
      for(map<string,   itemstruct>::iterator   i   =   mymap.begin();   i   !=   mymap.end();) 
      { 
              if(i->second.a   >   100) 
                      i   =   mymap.erase(i); 
              else 
                      ++i; 
      } 

    解答4: VC6中编译map编译出错的解决方法
    Warnings similar to the following are generated even if you use the warning pragma to disable the warning: warning C4786: 'std::rb_tree<CAiSpanningTree<State,std::less<State>>::TransClosureNode, CAiSpanningTree<State,std::less<State>>::TransClosureNode,std::ident<Cai SpanningTree<State,std::less<State>>::TransClosureNode,CAiSpanningTree<S tate,std::less<State>>::TransClosureNode>,std::less<CAiSpanningTree<Stat e,std::less<State>>::TransClosureNode>>' : identifier was truncated to '255' characters in the debug information


    解决code 加在stdafx.h的头文件处:

       #pragma warning(disable:4786)

    展开全文
  • c++map容器的使用

    千次阅读 2018-03-02 13:21:02
    C++map容器提供一个键值对容器,map与multimap差别仅仅在于multiple允许一个键对应多个值。 一、map的说明 1头文件 #include<map> 2定义 map<string,int>my_Map; 或者是typedefmap<string,int>...

    C++中map容器提供一个键值对容器,map与multimap差别仅仅在于multiple允许一个键对应多个值。   

    一、map的说明  
      1   头文件 
      #include   <map> 
      
      2   定义 
      map<string,   int>   my_Map; 
      或者是typedef     map<string,   int>   MY_MAP; 
      MY_MAP   my_Map; 
      
      3   插入数据 
      (1)   my_Map["a"]   =   1; 
      (2)   my_Map.insert(map<string,   int>::value_type("b",2)); 
      (3)   my_Map.insert(pair<string,int>("c",3)); 

      (4)   my_Map.insert(make_pair<string,int>("d",4)); 

    第一种:用insert函数插入pair数据,下面举例说明:

      第二种:用insert函数插入value_type数据,下面举例说明:

    第三种:用数组方式插入数据,下面举例说明:

      

    4   查找数据和修改数据 

      (1)   int   i   =   my_Map["a"]; 
                my_Map["a"]   =   i; 
      (2)   MY_MAP::iterator   my_Itr; 
                my_Itr.find("b"); 
                int   j   =   my_Itr->second; 
                my_Itr->second   =   j; 
      不过注意,键本身是不能被修改的,除非删除。 
      
      5   删除数据 
      (1)   my_Map.erase(my_Itr); 
      (2)   my_Map.erase("c"); 
      还是注意,第一种情况在迭代期间是不能被删除的,道理和foreach时不能删除元素一样。 
      
      6   迭代数据 
      for   (my_Itr=my_Map.begin();   my_Itr!=my_Map.end();   ++my_Itr)   {} 
      
      7   其它方法 
      my_Map.size()               返回元素数目 
      my_Map.empty()       判断是否为空 
      my_Map.clear()           清空所有元素 
      可以直接进行赋值和比较:=,   >,   >=,   <,   <=,   !=   等等 
      
      更高级的应用查帮助去吧,^_^;

    展开全文
  • pair 是一个类模板,它将两个值组织在一起,这两个值的类型可不同。可以通过 first 和 second 公共数据成员来访问这两个值 pair对象常常作为元素被添加到map中 pair对象的定义 pair&lt;int, string&gt; ...
  • C++ Map 容器

    万次阅读 2013-01-24 12:51:32
    可以修改一个特定的节点而不对其他节点不产生影响,由于map是一种关联式容器,Key--value结构我们必须明确,在map中我们可以根据key的值修改其对应的value的值,而不能修改key的值,其最大的特点是key和value的值...
  • 定义Map容器之前,c++首先定义一个pair类型,这个类型有两个参数pair<T1,T2>。  pair类型的对象通过点号(.)访问其成员(都是公有成员)first与second。   pair类型可以通过make_pair()函数来进行...
  • C++ 之关联容器 map

    2019-10-02 17:18:53
    标准库定义了四种关联容器map是其中之一(另外还有set、multimap、...map类型,可以说是键-值对的集合,每一个键都与一个或多个值相关联。 利用它可以构造多钟函数: map<string , int > a; map<cha...
  • C++容器之映射map

    2021-01-15 00:40:58
    一般情况下,都是定义一个空的map对象 map<int,char>stud_sex_map; map是一个模板类,支持各种类型 map的使用 int main(int argc,char* argv[]) { map<int,char>stud_sex_map; stud_
  • c++ stl(4)map容器

    2020-10-15 22:35:11
    map的定义 map<typename1,typename2> mp; map<int,int> mp; ...map需要确定映射前类型(键key)和映射后类型(值 value) <...内填写两个类型,其中第一个键的类型,第二个是值的类型...map容器的内元素的访问
  • C++ map 映照容器

    2019-10-29 13:55:25
    map映照容器的元素数据是一个键值和一个映照数据组成的,键值与映照...使用map容器需要头文件包含语句“#include”, map文件也包含了对multimap多重映照容器的定义。 1、map创建、元素插入和遍历访问 创建map对象...
  • map映射容器的元素数据是由一个键值和一个映射数据组成的,键值与映照数据之间具有一一映照的关系。map容器的数据结构也采用红黑树来实现的,插入元素的键值不允许重复,比较函数只对元素的键值进行比较,元素的各项...
  • 10.3.2.map 定义的类型 map 接口的value_type 是 pair ...对迭代器进行解引用时,将获得一个引用,指向容器中一个 value_type 类型的值。对于 map 容器,其 value_type 是 pair 类型。 10.3.4.使用下标访问 map 对象
  • C++map容器提供一个键值对容器,map与multimap差别仅仅在于multiple允许一个键对应多个值。  一、map的说明   1 头文件   #include     2 定义   map my_Map;   或者是typedef map MY_MAP...
  • C++map容器提供一个键值对容器,map与multimap差别仅仅在于multiple允许一个键对应多个值。  一、map的说明   1 头文件  #include 2 定义  1.map my_Map; 2.typedef map MY_MAP; MY_MAP my_...
  • C++中关联容器map和set使用说明

    千次阅读 2015-10-25 17:14:00
    C++map容器提供一个键值对容器,map与multimap差别仅仅在于multiple允许一个键对应多个值。 (所以map关键字独一无二,重复插入不做操作) 一、map的说明   1 头文件   #include     2 定义   map my_...
  • C++map容器的使用说明

    千次阅读 2015-08-31 18:43:05
    C++map容器提供一个键值对容器,map与multimap差别仅仅在于multiple允许一个键对应多个值. 一.map的说明 1.头文件 #include 2.定义方法 (1)map m; (2)typedef map M;  M m; 3.插入数据 (1)m['a'] = 1 (2)m.insert...
  • C++map容器

    千次阅读 2014-05-10 10:30:58
    map是键-值对的集合,可以理解为关联数组,可以使用键作为下标来获取一个值  本文地址:http://www.cnblogs.com/archimedes/p/cpp-map.html,转载请注明源地址。 map对象的定义 使用前添加map头文件,必须...
  • C++关联容器map

    2017-09-02 17:55:00
    1.map简介  map中的元素是关键字-值对:关键字起到索引的作用,值表示与索引相关的数据。...比如电话簿也是一个map的例子,姓名作为关键字其对应的值就为该人的电话号码。map类型定义在头文件map中。 注...
  • C++关联容器Map

    2019-12-27 14:21:52
    map是键-值对的集合,map中的所有元素都是pair,可以使用键作为下标来获取一个值。Map中所有元素都会根据元素的值自动被排序,同时拥有实值value和键值key,pair的第一元素被视为键值,第二元素被视为实值,同时map...
  • C++标准库容器Map

    2018-12-30 21:29:45
    一个Map就是一个(关键码,值)对偶的序列,它提供基于关键码的快速提取操作。每个关键码至多保持一个值,换句话说,map中的关键码具有唯一性。 简单来说,map提供了一个映射关系来查找元素。 Map的部分成员 ...
  • 一、map容器定义 map是STL的一个关联容器,它是一个单映射容器。它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有...
  • ACM c++ map容器基本操作

    千次阅读 2014-08-26 22:51:44
    map容器提供一个键值对容器,map与multimap差别仅仅在于multiple允许一个键对应多个值 //map的定义 (1)mapm; (2)typedef map MAP;  MAP m; //插入元素 (1)m.insert(pair("c",1)); (2)m["c"]=1; (3)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 465
精华内容 186
热门标签
关键字:

c++定义一个map容器

c++ 订阅