zoukankan      html  css  js  c++  java
  • C++中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)

  • 相关阅读:
    二维线性表 list实现
    行测题
    邻接表
    链表中插入和删除结点
    linux监控指标和命令
    lr测试结果分析
    python 装饰器 decorator
    并查集 PID331 / 家族
    素数环 dfs+回溯
    catch the cow bfs
  • 原文地址:https://www.cnblogs.com/xiaopengren/p/3588470.html
Copyright © 2011-2022 走看看