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对象,丢入队列 ...
随机推荐
- hdu1863 最小生成树(prim)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1863 思路:最小生成树模板题,直接套模板. 代码: #include<iostrea ...
- 【hdu3948-不同回文串的个数】后缀数组
题意:求不同回文串的个数 n<=10^5 题解: 先按照manacher的构造方法改造一遍串,然后跑一遍manacher. 如ababa--> $#a#b#a#b#a#@ 然后跑一遍后缀数 ...
- no-jquery 05 Utilities
Utilities type // is this a function? typeof someValue === 'function'; // is this an object? someVal ...
- js总结-面向对象编程,DOM,BOM
- DAY7L2【C001】
出自附中练习场[难度C]————————————————————————————————————————————————————————————— [试题描述]有 N 个任务, 每个任务最多只能完成一 ...
- iOS 获取当前用户的用户路径并写入文件
NSString *path = [[@"~" stringByExpandingTildeInPath] stringByAppendingString: @"/tmp ...
- 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 ...
- BZOJ4527 : K-D-Sequence
先把所有数减去最小值,防止负数出现问题. $d=0$,直接$O(n)$扫过去即可. $d\neq 0$,首先通过双指针求出每个数作为右端点时往左可以延伸到哪里,中间任意两个数差值都是$d$的倍数且不重 ...
- POJ 2456 (二分)
题目链接: http://poj.org/problem?id=2456 题目大意:n个房子,m头牛,房子有一个横坐标,问将m头牛塞进房子,每两头牛之间的最大间隔是多少. 解题思路: 不难看出应该二分 ...
- Leetcode Reverse Words in a String
Given an input string, reverse the string word by word. For example,Given s = "the sky is blue& ...