STL初步学习(map)
3.map
map作为一个映射,有两个参数,第一个参数作为关键值,第二个参数为对应的值,关键值是唯一的
在平时使用的数组中,也有点类似于映射的方法,例如a[10]=1,但其实我们的关键值和对应的值只能是int类型映射到其他类型,导致做许多题的不方便,而map类型的两个参数可以是任意数据类型
map的定义
#include<map> //头文件
using namespace std;
map<typename,typename> a; //注意是两个参数
map<string,int> a;
map<vector<int>,string> a;
map<int,set<int>> a;
···
关于map的遍历方法,可以是下标遍历,也可以是迭代遍历,但是在下标遍历的时候,注意关键值的类型
map<char,int> a;
a['c']=9;
a['c']=10;
//因为关键值对应的值唯一,所以9会被10覆盖
for(map<typename,typename>::iterator it=a.begin();it!=a.end();it++){
cout<<*it.first<<" "<<*it.second;
cout<<it->first<<" "<<it->second;
//两种迭代的方法等价
}
然后是常用函数
①find( ) find(key)翻译关键值为key的映射的迭代器,时间复杂度为O(logN),N为元素个数
②size( ),clear( ) 前者返回有多少对映射(映射是两两出现的),时间复杂度O(1);clear( ) 清空map,时间复杂度O(N)
例题
这道题是放在优先队列中的,但是我觉得没必要我没想出来怎么做,所以我选择了map+结构体的做法处理这道题。
在读入数据时,我用string来处理待读入的字符串,并分别记录下双括号和逗号的位置,用来处理前提工作和后续工作(逗号可能是多个,用数组存储)。首先处理前提工作,申请一个空的string,每次+=s[i],因为string的功能,相当于把他们拼起来得到前提工作,以它为关键值,对应一个较大的值,对于之后的后续工作,他们所对应的较大值应该慢慢变小,但是基于同一个前提工作的后续工作,他们的值应该相同(这里可能不太好理解,会在代码中阐述)
然后我们用一个结构体,其中含两个变量,一个string类型,一个int类型,将map中的值放进去,再在结构体中对对应值进行排序就可以了
#include<bits/stdc++.h>
using namespace std;
map<string,int> a;
string s;
int maxn=9999999;
int n;
struct node{
int zhi;
string na;
}b[1000005];
bool cmp(node q,node w){
return q.zhi>w.zhi;
}
int main(){
cin>>n;
for(register int i=1;i<=n;i++){
cin>>s;
int le,ri,dou[100005];
int num=0;
for(register int j=0;j<s.length();j++){ //处理各个特殊字符的位置
if(s[j]=='(') le=j;
if(s[j]==')') ri=j;
if(s[j]==','){
num++;
dou[num]=j;
}
}
string l="";
for(register int j=0;j<le;j++) l+=s[j]; //单独处理前提工作
if(a[l]==0) a[l]=maxn; //将前提工作的值赋值为最大
if(le-ri+1==4&&(s[le+1]=='N')&&(s[le+2]=='U')&&(s[le+3]=='L')&&(s[le+4]=='L')) continue; //NULL直接跳过
maxn-=100; //这里提前减,保证之后的值会越来越小
int last=le;
for(register int k=1;k<=num;k++){
l="";
for(register int j=last+1;j<=dou[k]-1;j++){
l+=s[j];
}
a[l]=maxn;
last=dou[k];
}
}
int sum=1;
for(map<string,int>::iterator it=a.begin();it!=a.end();it++){
b[sum].na=it->first;
b[sum].zhi=it->second;
sum++;
}
sum-=1;
sort(b+1,b+1+sum,cmp);
for(register int i=1;i<=sum;i++){
cout<<b[i].na<<" ";
}
return 0;
}
STL初步学习(map)的更多相关文章
- STL初步学习(vector)
前文 初三下学期进入新的学习,对于前两年的学习内容因为各种原因 上课打游戏,睡觉,看视频 已经遗忘,忘记如何使用,算是重新学习一次信息学,希望能尽快将以前的内容弥补上来,争取能在CSP-2020取得一 ...
- STL初步学习(set)
2.set set可以看作一个集合,可以实现自动排序(升序)和去重 在许多题目中,都可以使用这个模板库,减少很多操作,例如P1923 第k小数,当然,这道题有很多奇奇怪怪的做法,分值都不同,之后会讲解 ...
- AcWing STL初步学习
vector, 变长数组,倍增的思想 size() 返回元素个数 empty() 返回是否为空 clear() 清空 front()/back() push_back()/pop_back() beg ...
- STL初步学习(queue,deque)
4.queue queue就是队列,平时用得非常多.栈的操作是只能是先进先出,与栈不同,是先进后出,与之后的deque也有区别.个人感觉手写队列有点麻烦,有什么head和tail什么的,所以说 STL ...
- STL的pair学习, map学习
http://blog.csdn.net/calvin_zcx/article/details/6072286 http://www.linuxidc.com/Linux/2014-10/107621 ...
- STL 中的map 与 hash_map的理解
可以参考侯捷编著的<STL源码剖析> STL 中的map 与 hash_map的理解 1.STL的map底层是用红黑树存储的,查找时间复杂度是log(n)级别: 2.STL的hash_ma ...
- json2.js的初步学习与了解
json2.js的初步学习与了解,想要学习json的朋友可以参考下. json2.js的初步学习与了解 1.)该js的下载地址是:http://www.json.org/json2.js 2.)在页面 ...
- UVa 11991:Easy Problem from Rujia Liu?(STL练习,map+vector)
Easy Problem from Rujia Liu? Though Rujia Liu usually sets hard problems for contests (for example, ...
- 老周的ABP框架系列教程 -》 一、框架理论初步学习
老周的ABP框架系列教程 -- 一.框架理论初步学习 1. ABP框架的来源与作用简介 1.1 简介 1.1.1 ABP框架全称为"ASP.NET Boilerplate ...
随机推荐
- Java实现 LeetCode 373 查找和最小的K对数字
373. 查找和最小的K对数字 给定两个以升序排列的整形数组 nums1 和 nums2, 以及一个整数 k. 定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2. 找 ...
- Java实现 LeetCode 236 二叉树的最近公共祖先
236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x ...
- Java实现 蓝桥杯VIP 算法训练 数对
算法训练 数对 时间限制:1.0s 内存限制:512.0MB 问题描述 编写一个程序,该程序从用户读入一个整数,然后列出所有的数对,每个数对的乘积即为该数. 输入格式:输入只有一行,即一个整数. 输出 ...
- Java实现 LeetCode 34 在排序数组中查找元素的第一个和最后一个位置
在排序数组中查找元素的第一个和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n ...
- java代码(14) --Java8函数式接口
Java8函数式接口 之前有关JDK8的Lambda表达式 Java代码(1)--Java8 Lambda 函数式接口可以理解就是为Lambda服务的,它们组合在一起可以让你的代码看去更加简洁 一.概 ...
- 自己动手写SQL执行引擎
自己动手写SQL执行引擎 前言 在阅读了大量关于数据库的资料后,笔者情不自禁产生了一个造数据库轮子的想法.来验证一下自己对于数据库底层原理的掌握是否牢靠.在笔者的github中给这个database起 ...
- Linux目录处理命令cd、pwd、rmdir、cp、mv、rm详解
命令cd详解 命令cd(英文原意:change directory),命令路径及执行权限为: 可以看到它的路径为/usr/bin/cd,因此,它的执行权限是所有用户 基本功能是切换目录,例如:cd . ...
- linux下gdb调试方法与技巧整理
参考博客: https://blog.csdn.net/niyaozuozuihao/article/details/91802994 1.运行命令run:简记为 r ,其作用是运行程序,当遇到断点 ...
- mybatis源码解析-日志适配器
1.为什么需要使用适配器? 集成第三方日志组件,屏蔽日志组件底层实现,统一提供写日志的接口. 2.什么是适配器模式 定义:将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法 ...
- 别在重复造轮子了,几个值得应用到项目中的 Java 开源库送给你
我是风筝,公众号「古时的风筝」.文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面.公众号回复『666』获取高清大图. 风筝我作为一个野路子开发者,直到 ...