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对象,丢入队列 ...
随机推荐
- [技术学习]js正则表达式汇总
一.常用正则表达式关键字 ".":任意字符 "*":任意个数 "+":任意个数,至少一个 "?":0-1个 " ...
- Python基础4- 字符串
Python字符串是由数字.字母.下划线组成的一串字符,我们可以使用引号来创建字符串.如:str = 'Helloworld'在Python中没有char类型,单个字符也作为string使用; Pyt ...
- SQL批量更新数据库中所有用户数据表中字段类型为tinyint为int
--SQL批量更新数据库中所有用户数据表中字段类型为tinyint为int --关键说明:--1.从系统表syscolumns中的查询所有xtype='48'的记录得到类型为[tinyint]的字段- ...
- The 2015 China Collegiate Programming Contest C. The Battle of Chibi hdu 5542
The Battle of Chibi Time Limit: 6000/4000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Othe ...
- 使用Percona Toolkit解决Mysql主从不同步问题【备忘】
由于各种原因,mysql主从架构经常会出现数据不一致的情况出现,大致归结为如下几类 1:备库写数据 2:执行non-deterministic query 3:回滚掺杂事务表和非事务表的事务 4:bi ...
- 51Nod 1256 乘法逆元 Label:exgcd
1256 乘法逆元 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K ...
- 转:Web页面通过URL地址传递参数常见问题及检测方法
Web页面即我们在浏览器中所看到的网页,在Web应用程序中,其页面往往需要进行动态切换和数据交互,页面间的数据常规传递方法有多种,本文主要介绍Web页面处理程序中常见的URL地址参数传递方法,包括概述 ...
- 【JAVA】Spring 数据源配置整理
在Spring中,不但可以通过JNDI获取应用服务器的数据源,也可以直接在Spring容器中配置数据源,此外,还可以通过代码的方式创建一个数据源,以便进行无依赖的单元测试. 配置数据源 ...
- /var/log目录下的20个Linux日志文件功能详解
如果愿意在Linux环境方面花费些时间,首先就应该知道日志文件的所在位置以及它们包含的内容.在系统运行正常的情况下学习了解这些不同的日志文件有助于你在遇到紧急情况时从容找出问题并加以解决. 以下介绍的 ...
- MySQL连接池
1. using System; using System.Collections; using MySql.Data.MySqlClient; namespace Helper { /// < ...