zoukankan      html  css  js  c++  java
  • c++之map

    题目描述:
        哈利波特在魔法学校的必修课之一就是学习魔咒。据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮助。

        给你一部魔咒词典。当哈利听到一个魔咒时,你的程序必须告诉他那个魔咒的功能;当哈利需要某个功能但不知道该用什么魔咒时,你的程序要替他找到相应的魔咒。如果他要的魔咒不在词典中,就输出“what?”
    输入:

        首先列出词典中不超过100000条不同的魔咒词条,每条格式为:

        [魔咒] 对应功能

        其中“魔咒”和“对应功能”分别为长度不超过20和80的字符串,字符串中保证不包含字符“[”和“]”,且“]”和后面的字符串之间有且仅有一个空格。词典最后一行以“@END@”结束,这一行不属于词典中的词条。
        词典之后的一行包含正整数N(<=1000),随后是N个测试用例。每个测试用例占一行,或者给出“[魔咒]”,或者给出“对应功能”。

    输出:
        每个测试用例的输出占一行,输出魔咒对应的功能,或者功能对应的魔咒。如果魔咒不在词典中,就输出“what?”
    • 样例输入:
    • [expelliarmus] the disarming charm
      [rictusempra] send a jet of silver light to hit the enemy
      [tarantallegra] control the movement of one's legs
      [serpensortia] shoot a snake out of the end of one's wand
      [lumos] light the wand
      [obliviate] the memory charm
      [expecto patronum] send a Patronus to the dementors
      [accio] the summoning charm
      @END@
      4
      [lumos]
      the summoning charm
      [arha]
      take me to the sky
       
    • 样例输出:
    • light the wand
      accio
      what?
      what?

      解题代码:
      #include<iostream>
      #include<fstream>
      #include<algorithm>
      #include<string>
      #include<map>
      using namespace std;

      map<string,string> dic[2]; //定义了两个map
      map<string,string>::iterator iter;
      int main()
      {
          int i,n;
          string str,word,meaning,strn; //cin.ignore(n,终止字符) ,不带参数的就是读入‘/n’然后丢弃。
          getline(cin,str); //从输入流中读取一行
          while(str!="@END@")
          {
              i=str.find("]");
              word=str.substr(1,i-1);
              meaning=str.substr(i+2);
              dic[0].insert(pair<string,string>(word,meaning));//insert方法插入map
              dic[1].insert(pair<string,string>(meaning,word));
              getline(cin,str);
          }
          cin>>n;
         cin.ignore();
          while(n--)
          {  
              getline(cin,str);
              i=str.find("]");
              if(i==-1) //以meaning为索引查找
              {
                  iter=dic[1].find(str); //map的find方法
                  if(iter!=dic[1].end())
                  {
                      cout<<iter->second<<endl;
                  }
                  else
                  {
                      cout<<"what?"<<endl;
                  }
              }
              else
              {
                str=str.substr(1,i-1);
                iter=dic[0].find(str);
                if(iter!=dic[0].end())
                {
                  cout<<iter->second<<endl;
                  }
                else
                {
                  cout<<"what?"<<endl;
                }
              }
         }
         return 0;
      }

      注:关于getline(cin,str)之前必须有一个cin.ignore()
      原因:首先要知道cin都是读缓冲区的数据cin>>str1后,缓冲区还有  ,然后随便输入点什么比如abc,现在缓冲区是 abc
      这时候如果 cin.getline(); 他把 读走了然后扔了返回空串,你刚才输入的abc就哦了……
      但是getline(cin,str)是把一行结尾的/n都读进去了,所以getline()之后可以再getline;总之就是cin>>;cin.ignore;cin.getline();getline();...

    Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,总结了一些map基本简单实用的操作!
    1. map最基本的构造函数;
       map<string , int >mapstring;         map<int ,string >mapint;
       map<sring, char>mapstring;         map< char ,string>mapchar;
       map<char ,int>mapchar;            map<int ,char >mapint;

    2. map添加数据;

       map<int ,string> maplive;  
       1.maplive.insert(pair<int,string>(102,"aclive"));
       2.maplive.insert(map<int,string>::value_type(321,"hai"));
       3, maplive[112]="April";//map中最简单最常用的插入添加!
    3,map中元素的查找:

       find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。        

       map<int ,string >::iterator l_it;; 
       l_it=maplive.find(112);
       if(l_it==maplive.end())
                    cout<<"we do not find 112"<<endl;
       else cout<<"wo find 112"<<endl;
    4,map中元素的删除:
       如果删除112;
       map<int ,string >::iterator l_it;;
       l_it=maplive.find(112);
       if(l_it==maplive.end())
            cout<<"we do not find 112"<<endl;
       else  maplive.erase(l_it);  //delete 112;
    5,map中 swap的用法:
      Map中的swap不是一个容器中的元素交换,而是两个容器交换;
      For example:
      #include <map>
      #include <iostream>

      using namespace std;

      int main( )
      {
          map <int, int> m1, m2, m3;
          map <int, int>::iterator m1_Iter;

          m1.insert ( pair <int, int>  ( 1, 10 ) );
          m1.insert ( pair <int, int>  ( 2, 20 ) );
          m1.insert ( pair <int, int>  ( 3, 30 ) );
          m2.insert ( pair <int, int>  ( 10, 100 ) );
          m2.insert ( pair <int, int>  ( 20, 200 ) );
          m3.insert ( pair <int, int>  ( 30, 300 ) );

       cout << "The original map m1 is:";
       for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )
          cout << " " << m1_Iter->second;
          cout   << "." << endl;

       // This is the member function version of swap
       //m2 is said to be the argument map; m1 the target map
       m1.swap( m2 );

       cout << "After swapping with m2, map m1 is:";
       for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )
          cout << " " << m1_Iter -> second;
          cout  << "." << endl;
       cout << "After swapping with m2, map m2 is:";
       for ( m1_Iter = m2.begin( ); m1_Iter != m2.end( ); m1_Iter++ )
          cout << " " << m1_Iter -> second;
          cout  << "." << endl;
       // This is the specialized template version of swap
       swap( m1, m3 );

       cout << "After swapping with m3, map m1 is:";
       for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )
          cout << " " << m1_Iter -> second;
          cout   << "." << endl;
    }

    6.map的sort问题:
      Map中的元素是自动按key升序排序,所以不能对map用sort函数:
      For example:
      #include <map>
      #include <iostream>

      using namespace std;

     int main( )
     {
       map <int, int> m1;
       map <int, int>::iterator m1_Iter;

       m1.insert ( pair <int, int>  ( 1, 20 ) );
       m1.insert ( pair <int, int>  ( 4, 40 ) );
       m1.insert ( pair <int, int>  ( 3, 60 ) );
       m1.insert ( pair <int, int>  ( 2, 50 ) );
       m1.insert ( pair <int, int>  ( 6, 40 ) );
       m1.insert ( pair <int, int>  ( 7, 30 ) );

       cout << "The original map m1 is:"<<endl;
       for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )
          cout <<  m1_Iter->first<<" "<<m1_Iter->second<<endl;
      
    }
      The original map m1 is:
      1 20
      2 50
      3 60
      4 40
      6 40
      7 30
      请按任意键继续. . .

    7,   map的基本操作函数:
          C++ Maps是一种关联式容器,包含“关键字/值”对
          begin()          返回指向map头部的迭代器
          clear()         删除所有元素
          count()          返回指定元素出现的次数
          empty()          如果map为空则返回true
          end()            返回指向map末尾的迭代器
          equal_range()    返回特殊条目的迭代器对
          erase()          删除一个元素
          find()           查找一个元素
          get_allocator()  返回map的配置器
          insert()         插入元素
          key_comp()       返回比较元素key的函数
          lower_bound()    返回键值>=给定元素的第一个位置
          max_size()       返回可以容纳的最大元素个数
          rbegin()         返回一个指向map尾部的逆向迭代器
          rend()           返回一个指向map头部的逆向迭代器
          size()           返回map中元素的个数
          swap()            交换两个map
          upper_bound()     返回键值>给定元素的第一个位置
          value_comp()      返回比较元素value的函数

  • 相关阅读:
    套题 codeforces 361
    hdu 5720
    套题 codeforces 360
    套题 codeforces 359
    套题 bestcoder 84
    hdu 5748(求解最长上升子序列的两种O(nlogn)姿势)
    观django-messages包笔记
    django form
    省份、城市、区县三级联动Html代码
    django perm用法
  • 原文地址:https://www.cnblogs.com/wangccc/p/5309830.html
Copyright © 2011-2022 走看看