关联容器:map

map的键和值可以是不同的类型,键是唯一的,每个键都对应一个值。map可被当做希哈表使用,它建立了从键(关键字)到值的映射。map是键和值的一一映射,使用时需要引入头文件#include <map>

map的迭代器和set类似,支持双向访问,不支持随机访问,执行一次++--操作的时间复杂度均为O(logn)O(logn)O(logn)。默认的元素顺序为升序,也可以通过第3个模板参数设置为降序。

map<string, int> a; //升序
map<string, int, greater<string> > a;//降序

map模板的第一个参数为键的类型,第2个参数为值的类型,第3个参数可选,用于对键进行排序的比较函数或对象。

map中,键和值是一对数,可以使用make_pair生产一对数(键,值)进行插入。

a.insert(make_pair(s,i));

输出时,可以分别输出第1个元素(键)和第2个元素(值)。

for (auto it = a.begin(); it != a.end(); it++){cout << it->first << "\t" << it->second << endl;
}
  • size/empty/clear:元素个数、判空、清空。
  • begin/end:开始位置和结束位置。
  • insert(x):将元素x插入合集(x为二元组)。
  • erase(x):删除所有等于x的元素(x为二元组)。
  • erase(it):删除it迭代器指向的元素(it为指向二元组的迭代器)。
  • find(k):查找键为k的二元组的位置,若不存在,则返回尾指针。
    可以通过[]操作符直接得到键映射的值,也可以通过赋值操作改变键映射的值,例如h[key] = val

例如,可以用map统计字符串出现的次数。

map<string,int> mp;
mp.clear();
string word;
for (int i = 0; i < n; i++){cin>>s;mp[s]++;//s为键,增加的是值
}
count<<"输入字符串s,查询该字符串出现的次数:"<< endl;
cin >> s;
cout << mp[s] << endl;

需要特别注意的是,如果查找的key不存在,则执行h[key]之后会自动新建一个二元组(key,0)并返回0。进行多次查找之后,有可能包含很多无用的二元组,因此使用查找时最好先查询key是否存在。

if(mp.find(s)!=mp.end){cout<<mp[s]<<endl;
}
else{cout << "没找到!" << endl;
}

题目描述

某国有数百种硬木树种,该国自然资源部利用卫星成像技术编译了一份特定日期每棵树的物种清单。计算每个物种占所有种群的百分比

输入:输入包括没课树的物种清单,每行一棵树。物种名称不超过30个字符,卜曹刚1000000棵树。

输出:按字母顺序输出植物种群中代表的每个物种的名称,然后是占所有种群的百分比,保留小数点后4位。

#include <iostream>
#include <map>
#include <string>int main()
{using namespace std;map<string,int> mp;int cnt = 0;string s;while(getline(cin,s) && s != "#"){//整行读取mp[s]++;cnt++;}for (auto it = mp.begin(); it != mp.end(); it++) {cout << it->first <<" ";printf("%.4f\n",100.0*(it->second)/cnt);}return 0;
}

输入:

Red Alder
Ash
Aspen
Basswood
Ash
Beech
Yellow Birch
Ash
Cherry
Cottonwood
Ash
Cypress
Red Elm
Gum
Hackberry
White Oak
Hickory
Pecan
Hard Maple
White Oak
Soft Maple
Red Oak
Red Oak
White Oak
Poplan
Sassafras
Sycamore
Black Walnut
Willow
#

输出:

Ash 13.7931
Aspen 3.4483
Basswood 3.4483
Beech 3.4483
Black Walnut 3.4483
Cherry 3.4483
Cottonwood 3.4483
Cypress 3.4483
Gum 3.4483
Hackberry 3.4483
Hard Maple 3.4483
Hickory 3.4483
Pecan 3.4483
Poplan 3.4483
Red Alder 3.4483
Red Elm 3.4483
Red Oak 6.8966
Sassafras 3.4483
Soft Maple 3.4483
Sycamore 3.4483
White Oak 10.3448
Willow 3.4483
Yellow Birch 3.4483

题目描述

银行的每个客户都有一个正整数标识KKK,到银行请求服务时将收到一个正整数优先级别PPP。银行经理提议打破传统,有时为优先级最低的客户服务,而不是优先级最高的客户服务。系统将收到以下类型的请求。

  • 0:系统需要停止服务
  • 1 K P:将客户K及其优先级P添加到等待列表中。
  • 2:为优先级最高的客户提供服务,并将其从等待名单中删除。
  • 3:为优先级最低的客户提供服务,并将其从等待名单中删除。

输入:输入的每一行都包含一个请求,只有最后一行包含停止请求(代码0)。假设在列表中包含新客户的请求时(代码1),在列表中没有同一客户的其他请求或有相同的优先级。标识符K小于10610^{6}106,优先级P小于10710^{7}107。客户可以多次到银行请求服务,并且每次都可以获得不同的优先级。

输出::对于代码为2或3的每个请求,都单行输出所服务客户的标识,如果请求时等待列表为空,则输出0。

#include <iostream>
#include <map>
#include <string>int main()
{using namespace std;map<int,int> mp;int n,k,p;while(scanf("%d",&n) && n){switch(n){case 1:{scanf("%d %d", &k, &p);mp[p] = k;break;}case 2:{if(mp.empty()){printf("0\n");break;}auto it = --mp.end();printf("%d\n",it->second);mp.erase(it);break;}case 3:{if(mp.empty()){printf("0\n");break;}auto it = mp.begin();printf("%d\n",it->second);mp.erase(it);break;}}}return 0;
}

输入:

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

输出:

0
20
30
10
0

题目描述

Joe经营着一家水果店,他想要一份水果销售情况明细表,这样就可以很容易掌握所有水果的销售情况了。

输入:第1行输入正整数N(0<N≤10)N(0< N \leq 10)N(0<N≤10),表示有NNN组测试数据。每组测试数据的第1行都是一个整数M(0<M≤100)M(0 < M \leq 100)M(0<M≤100),表示共有MMM次成功的交易。其后有MMM行数据,每行都表示一次交易,由水果名称(小写字母组成,长度不超过80)、水果产地(由小写字母组成,长度不超过80)和交易的水果数量(正整数,不超过100)组成。

输出:对每组测试数据,都按照输出样例输出水果销售情况明细表,这份明细表包括所有水果的产地、名称和小时数量的信息。水果先按产地分类,产地按照字母顺序排列:同一产地的水果按照名称排序,名称安装字母顺序排序。没两组测试数据之间都有一个空行。最后一组测试数据之后没有空行。

#include <iostream>
#include <map>
#include <string>int main()
{using namespace std;string name, place;int n, m, num;(cin >> n).get();while(n--){map<string,map<string,int> >mp;//二维mapcin >> m;for (int i = 0; i < m; ++i) {cin >> name >> place >> num;mp[place][name]+=num;}for (auto iter1 = mp.begin(); iter1 != mp.end(); iter1++){cout << iter1->first << endl;for (auto iter2 = iter1->second.begin(); iter2 != iter1->second.end(); iter2++) {cout << "   |----" << iter2->first << "("<<iter2->second << ")"<<endl;}}if(n){cout<<endl;}}return 0;
}

输入:

1
5
apple shangdong 3
pineapple guangdong 1
sugarcane guangdong 1
pineapple guangdong 3
pineapple guangdong 1

输出:

guangdong|----pineapple(5)|----sugarcane(1)
shangdong|----apple(3)

算法训练营 训练 硬木种类、双重队列、水果(关联容器map)相关推荐

  1. 算法训练营 训练 骑士移动(队列)

    队列queue 队列只允许从队尾入队.从队头出队,不允许再中间位置插入和删除,不支持数组表示法和随机访问.使用queue时需要引入头文件#include<queue>. queue< ...

  2. 算法训练营 训练 间谍(C语言)

    X国的情报委员收到一份可靠的信息,信息表明Y国将派间谍去窃取X国的机密文件.X国指挥官手中有两份名单列表,一份是Y国派往X国的间谍名单列表,另一份是X国以前派往Y国的间谍名单列表.这两份名单列表可能有 ...

  3. 算法训练营学习笔记1

    算法训练营学习笔记 贪心算法 心算法总是做出当前最好的选择,期望通过局部最优选择得到全局最优的解决方案.从问题的初始解开始,一步歩地做出当前最好的选择,逐步逼近问题的目标,尽可能得到最优解: 贪心本质 ...

  4. 代码随想录算法训练营Day12 栈与队列

    #代码随想录算法训练营 代码随想录算法训练营Day12 栈与队列| 239. 滑动窗口最大值 347.前 K 个高频元素 总结 239. 滑动窗口最大值 给定一个数组 nums,有一个大小为 k 的滑 ...

  5. 代码随想录算法训练营第35天|860.柠檬水找零,406.根据身高重建队列,452. 用最少数量的箭引爆气球

    代码随想录算法训练营第35天|860.柠檬水找零,406.根据身高重建队列,452. 用最少数量的箭引爆气球 860.柠檬水找零 406. 根据身高重建队列 452. 用最少数量的箭引爆气球 860. ...

  6. 算法训练营 重编码_编码训练营后如何找到工作

    算法训练营 重编码 by Roxy Ayaz 由Roxy Ayaz 编码训练营后如何找到工作 (How to get a job after a coding bootcamp) Getting a ...

  7. 算法训练营 重编码_完成编码训练营后的第一年,我学到了教训。

    算法训练营 重编码 by Mario Hoyos 通过马里奥·霍约斯(Mario Hoyos) 完成编码训练营后的第一年,我学到了教训. (Lessons I learned the first ye ...

  8. [经验分享] 覃超算法训练营学习笔记

    本文为覃超算法训练营的课程笔记 推荐学习网站 学习数据结构的动画演示网站 B站 覃超大魔王 Snailclimb/JavaGuide 工欲善其事,必先利其器 simple collaborative ...

  9. 极客时间 算法训练营 毕业总结

    不知不觉8周的算法训练营也接近尾声,这期间训练营对自己的影响有三方面 一方面是收获了刻意练习,终身成长这些可以产生长远影响的思想,这里推荐三本书 卡罗尔·德韦克的<终身成长>.安德斯·艾利 ...

最新文章

  1. Cnnot find System Java Compiler Ensure that you have installed a JDK
  2. 【论文小技巧】一招搞定论文高速下载
  3. 使用交换机的dhcp snooping拒绝非法dhcp服务
  4. php mail函数 附件,[php]mail函数发送邮件(正文+附件+中文)
  5. 二叉搜索时与双向链表python_剑指Offer(二十六) 二叉搜索树和双向链表
  6. 有三个数a,b,c,要求按大小顺序输出。
  7. wifi情况下使用fiddler_fiddler常见的应用场景
  8. SVD 与 PCA 的直观解释(1): 线性变换
  9. linux条件变量唤醒丢失,多线程编程精髓(三)
  10. 厉害了!为了干掉 HTTP ,Spring团队又开源 nohttp 项目!
  11. php无法上传,为什么php 大文件无法上传
  12. Carsim应用:LKA车道保持辅助系统(LQR控制器模型)
  13. 深入学习java的困惑:3年开发,下一步学习的方向以及要做什么?
  14. 如何创建属于自己的域名邮箱
  15. 常用iOS的第三方框架
  16. 商业智能BI与业务管理决策思维之三:业务质量分析
  17. ArcGIS教程 - 3 ArcGIS快速入门
  18. 比较TTL集成电路与CMOS集成电路
  19. 【微信小程序控制硬件③】 从软件到硬件搭建一个微信小程序控制esp8266的项目,自定义通讯协议,为面试职位和比赛项目加分!
  20. 设计模式——备忘录模式

热门文章

  1. JavaWeb与Tomcat简介
  2. 计算机专业 拒绝清华,2次拒绝北大邀请,获清华保送生资格,网友:清华计算机全球第一...
  3. python iphone 爬虫_python爬取京东所有iphone的价格和名称
  4. 【科技百咖】通友时代方林:以问题为导向,强化渠道伙伴能力
  5. 在python中import .pyx文件的各种坑
  6. 虚拟ip设置 - Keepalived详解
  7. xss盗取cookie原理剖析
  8. python图片识别
  9. android wear 最新设备,最全Android Wear 2.0设备升级名单:华为给力
  10. 2.5 大公司都在用的图片型封面