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后,缓冲区还有 \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的更多相关文章
- mapreduce中一个map多个输入路径
package duogemap; import java.io.IOException; import java.util.ArrayList; import java.util.List; imp ...
- .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法
.NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...
- Java基础Map接口+Collections工具类
1.Map中我们主要讲两个接口 HashMap 与 LinkedHashMap (1)其中LinkedHashMap是有序的 怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...
- Java基础Map接口+Collections
1.Map中我们主要讲两个接口 HashMap 与 LinkedHashMap (1)其中LinkedHashMap是有序的 怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...
- 多用多学之Java中的Set,List,Map
很长时间以来一直代码中用的比较多的数据列表主要是List,而且都是ArrayList,感觉有这个玩意就够了.ArrayList是用于实现动态数组的包装工具类,这样写代码的时候就可以拉进 ...
- Java版本:识别Json字符串并分隔成Map集合
前言: 最近又看了点Java的知识,于是想着把CYQ.Data V5迁移到Java版本. 过程发现坑很多,理论上看大部分很相似,实践上代码写起来发现大部分都要重新思考方案. 遇到的C#转Java的一些 ...
- MapReduce剖析笔记之八: Map输出数据的处理类MapOutputBuffer分析
在上一节我们分析了Child子进程启动,处理Map.Reduce任务的主要过程,但对于一些细节没有分析,这一节主要对MapOutputBuffer这个关键类进行分析. MapOutputBuffer顾 ...
- MapReduce剖析笔记之七:Child子进程处理Map和Reduce任务的主要流程
在上一节我们分析了TaskTracker如何对JobTracker分配过来的任务进行初始化,并创建各类JVM启动所需的信息,最终创建JVM的整个过程,本节我们继续来看,JVM启动后,执行的是Child ...
- MapReduce剖析笔记之五:Map与Reduce任务分配过程
在上一节分析了TaskTracker和JobTracker之间通过周期的心跳消息获取任务分配结果的过程.中间留了一个问题,就是任务到底是怎么分配的.任务的分配自然是由JobTracker做出来的,具体 ...
- MapReduce剖析笔记之三:Job的Map/Reduce Task初始化
上一节分析了Job由JobClient提交到JobTracker的流程,利用RPC机制,JobTracker接收到Job ID和Job所在HDFS的目录,够早了JobInProgress对象,丢入队列 ...
随机推荐
- 本BLOG简介(内有一道UVa524素数环进阶版)【B001】
[B001]Hi,大家好,今天我的博客第一天开通,今天奉上开博题,出自首都师师范大学附属中学OJ(题号未知在练习场中)原题为UVa524,题目要求如下: [难度B]—————————————————— ...
- Codeforces Round #334 (Div. 2)
水 A - Uncowed Forces #include <bits/stdc++.h> using namespace std; typedef long long ll; const ...
- POJ3308 Paratroopers(最小割/二分图最小点权覆盖)
把入侵者看作边,每一行每一列都是点,选取某一行某一列都有费用,这样问题就是选总权最小的点集覆盖所有边,就是最小点权覆盖. 此外,题目的总花费是所有费用的乘积,这时有个技巧,就是取对数,把乘法变为加法运 ...
- Shell 编程基础之 If 练习
一.语法 if [ condition ]; then # 当 condition 成立时,执行内容: fi # 将 if 反过来写,fi 结束 if 之意 if [ condition ]; the ...
- 11039 - Building designing
Building designing An architect wants to design a very high building. The building will consist o ...
- BZOJ4231 : 回忆树
一个长度为$|S|$的串在树上匹配有两种情况: 1.在LCA处转弯,那么这种情况只有$O(|S|)$次,暴力提取出长度为$2|S|$的链进行KMP即可. 2.不转弯,那么可以拆成两个到根路径的询问. ...
- Android -- TextView (3)
1.效果图
- Android --SeekBar的使用
1. 效果图
- url 转码
//URL解码 //-(NSString *)URLDecodedString:(NSString *)str //{ // NSString *decodedString=(__bridge_tra ...
- Linux3.4内核 Yaffs2文件系统的移植
作者:李老师,华清远见嵌入式学院讲师. [实验目的] Yaffs2文件系统是嵌入式系统中常用到的一种文件系统,是也是移植Android所必须的.通过向FS_S5PC100平台移植Yaffs文件系统,了 ...