栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【c++入门(2)】关联容器map

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【c++入门(2)】关联容器map

一、map简介

map是一个关键字-值(key - value)的集合,就是可以通过key而找到value的一种关联数组。我们称这样的数据结构为:从key到value的映射,把key映射成value。

头文件:#include < map >

二、map的定义和访问

map 定义:map < key类型 , value类型 > 容器名称 ;

map < string , string > m1 ;   //定义一个key和value都是string的空容器m1
map < string , int> m2 ; //定义一个key为string value为int的空容器m2,通常用于字符串的桶数组
map < int , int > m3 ; //定义一个key和value都是int的空容器m3

技巧:有的时候可以定义一个map < long long , long long > 来做一个大桶数组,这样就相当于定义了一个cnt[long long]的桶数组,用普通的数组是无法实现的。

map的访问方式:下标访问

map类似于数组可以下标访问,访问的下表和key必须是一种数据类型!
例:
修改:dic[key] = value ;
访问:dic[key] ;

三、迭代器

(1)定义方式:map < key类型 , value类型 > ::iterator 名称 ;
(2)相关函数
提醒⚠:迭代器不支持< > <= >= += -= + -等操作

map会按照key从小到大排序所以输出顺序可能和输入顺序不同。
注意:end()返回的是尾元素后一个位置的迭代器,左闭右开。
可以通过迭代器来判断map容器mp是否为空:
if (mp.begin () == mp.end ()) empty ;

迭代器遍历:
能像这样吗?
肯定是不能,因为迭代器不支持<,正确代码:

迭代器的修改方法:
查询操作:

四、例题
反片语[Ananagrams,UVa156]
题目描述

字谜中,一组由相同的字母按照不同的顺序组成的不同的单词,比如:OPTS、SPOT、STOP、POTS、POST,这样的单词我们称之为“anagrams”,但是另外有一些词确不具有这样的属性,比如QUIZ,无论你怎么重排单词中的字母顺序,都不能得到另一个单词。这样的单词我们称之为"ananagrams"。

编写一个程序,读入字典中的一些单词,然后找出所有的相对"ananagrams"(该单词不能通过重排字母,得到输入文件中的另外一个单词)。注意单个字母的词,事实上都是ananagrams,因为单个字母的词不能被重排。输入文件的单词总数不超过1000个。
输入格式

输入文件包含多行,每行多个单词,每一行的总长度不超过80个字符。每个单词由最多20个大写或者小写字母组成,且不会跨行。单词和单词之间可能有一个或者多个空格,

注意,在判断是否是"anagrams"时,不区分大小写,比如tIeD’和 ‘EdiT’是anagrams。

当遇到单独的一行“#”时,表示输入结束。
输出格式

输出包含多行,输出输入文件中的ananagrams,一行一个单词,输出顺序按照字典序排序(所有大写字母在所有小写字母前面),且输出时保留输入文件中这个单词的大小写。
输入输出样列
输入样例1:

ladder came tape soon leader acme RIDE lone Dreis peat
 ScAlE orb eye Rides dealer NotE derail LaCeS drIed
noel dire Disk mace Rob dries
#

输出样例1:

Disk
NotE
derail
drIed
eye
ladder
soon

CODE:

#include 

using namespace std;

vector < string > words ;
map < string , int > dict ;
string slove (const string & s)
{
	string t = s ;
	for (int i = 0; i < t.size (); i++)
	{
		if (t[i] >= 'A' && t[i] <= 'Z') t[i] += ' ' ;
	}
	sort (t.begin () , t.end ()) ;
	return t ;
}

int main()
{


	string w ;
	while (cin >> w)
	{
		if (w == "#") break ;
		words.push_back (w) ;
		string s = slove (w) ;
		if (dict.count (s) == 0) dict[s] = 1 ;
		else dict[s] ++ ;
	}
	
	sort (words.begin () , words.end ()) ;
	for (int i = 0; i < words.size (); i++)
	{
		if (dict[slove (words[i])] == 1) cout << words[i] << endl ;
	}
	


    return 0;
}

银行系统
题目描述

某银行有一个系统,银行的每个客户端都由一个正整数K(K≤10^6)标识,在到达银行办理某些业务时,会收到一个正整数优先级P(P≤10^7)。
此系统在办理业务时会接收到以下类型的服务请求:
① 1 K P表示添加优先级为P的客户K到等待列表中
② 2 表示处理等待列表中优先级最高的客户的业务,然后将此客户从等待列表中删除
③ 3 表示处理等待列表中优先级最低的客户的业务,然后将此客户从等待列表中删除
④ 0 系统停止服务
你的任务是帮助系统的开发人员编写程序来实现这种服务请求。
输入格式

输入多条服务请求,只有输入的最后一行是0.
一个客户端可以有多次请求。

数据保证,每个请求的优先级各不不同。
输出格式

对于所有服务编号为2或3的服务请求,输出此客户的客户端标识符。如果当一个服务请求过来时,此时服务的等待列表为0,则输出0.
输入输出样列
输入样例1:

2
1 20 14
1 30 3
2
1 10 99
3
2
2
0

输出样例1:

0
20
30
10
0

CODE:

#include 

using namespace std;

map < int , int > dict ;

int cmd , k , p ;

int main()
{


	while (scanf ("%d" , & cmd) == 1 && cmd)
	{
		if (cmd == 1)
		{
			cin >> k >> p ;
			dict[p] = k ;
		}else
		{
			if (dict.empty ())
			{
				printf ("0n") ;
				continue ;
			}
			map < int , int > :: iterator it ;
			if (cmd == 2)
			{
				it = dict.end () ;
				it -- ;
			}else
			{
				it = dict.begin () ;
			}
			printf ("%dn" , it -> second) ;
			dict.erase (it) ;
		}
	}


    return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/998045.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号