题目描述:
    哈利波特在魔法学校的必修课之一就是学习魔咒。据说魔法世界有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后,缓冲区还有 \n ,然后随便输入点什么比如abc,现在缓冲区是\nabc
    这时候如果 cin.getline(); 他把\n读走了然后扔了返回空串,你刚才输入的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的函数

c++之map的更多相关文章

  1. mapreduce中一个map多个输入路径

    package duogemap; import java.io.IOException; import java.util.ArrayList; import java.util.List; imp ...

  2. .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法

    .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...

  3. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  4. Java基础Map接口+Collections

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  5. 多用多学之Java中的Set,List,Map

            很长时间以来一直代码中用的比较多的数据列表主要是List,而且都是ArrayList,感觉有这个玩意就够了.ArrayList是用于实现动态数组的包装工具类,这样写代码的时候就可以拉进 ...

  6. Java版本:识别Json字符串并分隔成Map集合

    前言: 最近又看了点Java的知识,于是想着把CYQ.Data V5迁移到Java版本. 过程发现坑很多,理论上看大部分很相似,实践上代码写起来发现大部分都要重新思考方案. 遇到的C#转Java的一些 ...

  7. MapReduce剖析笔记之八: Map输出数据的处理类MapOutputBuffer分析

    在上一节我们分析了Child子进程启动,处理Map.Reduce任务的主要过程,但对于一些细节没有分析,这一节主要对MapOutputBuffer这个关键类进行分析. MapOutputBuffer顾 ...

  8. MapReduce剖析笔记之七:Child子进程处理Map和Reduce任务的主要流程

    在上一节我们分析了TaskTracker如何对JobTracker分配过来的任务进行初始化,并创建各类JVM启动所需的信息,最终创建JVM的整个过程,本节我们继续来看,JVM启动后,执行的是Child ...

  9. MapReduce剖析笔记之五:Map与Reduce任务分配过程

    在上一节分析了TaskTracker和JobTracker之间通过周期的心跳消息获取任务分配结果的过程.中间留了一个问题,就是任务到底是怎么分配的.任务的分配自然是由JobTracker做出来的,具体 ...

  10. MapReduce剖析笔记之三:Job的Map/Reduce Task初始化

    上一节分析了Job由JobClient提交到JobTracker的流程,利用RPC机制,JobTracker接收到Job ID和Job所在HDFS的目录,够早了JobInProgress对象,丢入队列 ...

随机推荐

  1. hdu1863 最小生成树(prim)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1863 思路:最小生成树模板题,直接套模板. 代码: #include<iostrea ...

  2. 【hdu3948-不同回文串的个数】后缀数组

    题意:求不同回文串的个数 n<=10^5 题解: 先按照manacher的构造方法改造一遍串,然后跑一遍manacher. 如ababa--> $#a#b#a#b#a#@ 然后跑一遍后缀数 ...

  3. no-jquery 05 Utilities

    Utilities type // is this a function? typeof someValue === 'function'; // is this an object? someVal ...

  4. js总结-面向对象编程,DOM,BOM

  5. DAY7L2【C001】

    出自附中练习场[难度C]————————————————————————————————————————————————————————————— [试题描述]有 N 个任务, 每个任务最多只能完成一 ...

  6. iOS 获取当前用户的用户路径并写入文件

    NSString *path = [[@"~" stringByExpandingTildeInPath] stringByAppendingString: @"/tmp ...

  7. Drawing Arc Using ArcSegment in XAML

    We can use the Arc XAML element to draw arcs in XAML. Besides drawing arcs using the Arc element, we ...

  8. BZOJ4527 : K-D-Sequence

    先把所有数减去最小值,防止负数出现问题. $d=0$,直接$O(n)$扫过去即可. $d\neq 0$,首先通过双指针求出每个数作为右端点时往左可以延伸到哪里,中间任意两个数差值都是$d$的倍数且不重 ...

  9. POJ 2456 (二分)

    题目链接: http://poj.org/problem?id=2456 题目大意:n个房子,m头牛,房子有一个横坐标,问将m头牛塞进房子,每两头牛之间的最大间隔是多少. 解题思路: 不难看出应该二分 ...

  10. Leetcode Reverse Words in a String

    Given an input string, reverse the string word by word. For example,Given s = "the sky is blue& ...