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)的更多相关文章

  1. STL初步学习(vector)

    前文 初三下学期进入新的学习,对于前两年的学习内容因为各种原因 上课打游戏,睡觉,看视频 已经遗忘,忘记如何使用,算是重新学习一次信息学,希望能尽快将以前的内容弥补上来,争取能在CSP-2020取得一 ...

  2. STL初步学习(set)

    2.set set可以看作一个集合,可以实现自动排序(升序)和去重 在许多题目中,都可以使用这个模板库,减少很多操作,例如P1923 第k小数,当然,这道题有很多奇奇怪怪的做法,分值都不同,之后会讲解 ...

  3. AcWing STL初步学习

    vector, 变长数组,倍增的思想 size() 返回元素个数 empty() 返回是否为空 clear() 清空 front()/back() push_back()/pop_back() beg ...

  4. STL初步学习(queue,deque)

    4.queue queue就是队列,平时用得非常多.栈的操作是只能是先进先出,与栈不同,是先进后出,与之后的deque也有区别.个人感觉手写队列有点麻烦,有什么head和tail什么的,所以说 STL ...

  5. STL的pair学习, map学习

    http://blog.csdn.net/calvin_zcx/article/details/6072286 http://www.linuxidc.com/Linux/2014-10/107621 ...

  6. STL 中的map 与 hash_map的理解

    可以参考侯捷编著的<STL源码剖析> STL 中的map 与 hash_map的理解 1.STL的map底层是用红黑树存储的,查找时间复杂度是log(n)级别: 2.STL的hash_ma ...

  7. json2.js的初步学习与了解

    json2.js的初步学习与了解,想要学习json的朋友可以参考下. json2.js的初步学习与了解 1.)该js的下载地址是:http://www.json.org/json2.js 2.)在页面 ...

  8. 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, ...

  9. 老周的ABP框架系列教程 -》 一、框架理论初步学习

    老周的ABP框架系列教程 -- 一.框架理论初步学习   1. ABP框架的来源与作用简介 1.1  简介 1.1.1       ABP框架全称为"ASP.NET Boilerplate ...

随机推荐

  1. Entity FrameWork操作数据库完成登陆、列表显示+验证码

    登陆页面 登陆页面的页面结构比较简单,没有写样式. image标签的作用是用来显示验证码. 一般处理程序代码展示 using System; using System.Collections.Gene ...

  2. Java实现 LeetCode 326 3的幂

    326. 3的幂 给定一个整数,写一个函数来判断它是否是 3 的幂次方. 示例 1: 输入: 27 输出: true 示例 2: 输入: 0 输出: false 示例 3: 输入: 9 输出: tru ...

  3. Java实现 蓝桥杯VIP 算法提高 P0402

    算法提高 P0402 时间限制:1.0s 内存限制:256.0MB 猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个.第二天早上又将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前 ...

  4. 重学 Java 设计模式:实战桥接模式(多支付渠道「微信、支付宝」与多支付模式「刷脸、指纹」场景)

    作者:小傅哥 博客:https://bugstack.cn - 编写系列原创专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 为什么你的代码那么多ifelse 同类的业务.同样的功能, ...

  5. Python面试常用的高级用法,怎么动态创建类?

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第16篇文章,今天我们来聊聊Python当中的元类. 元类是Python当中的高级用法,如果你之前从来没见过这个术语 ...

  6. tensorflow2.0学习笔记第二章第一节

    2.1预备知识 # 条件判断tf.where(条件语句,真返回A,假返回B) import tensorflow as tf a = tf.constant([1,2,3,1,1]) b = tf.c ...

  7. 聊一聊Asp.net过滤器Filter那一些事

    最近在整理优化.net代码时,发现几个很不友好的处理现象:登录判断.权限认证.日志记录.异常处理等通用操作,在项目中的action中到处都是.在代码优化上,这一点是很重要着力点.这是.net中的过滤器 ...

  8. MySQL进阶篇(02):索引体系划分,B-Tree结构说明

    本文源码:GitHub·点这里 || GitEE·点这里 一.索引简介 1.基本概念 首先要明确索引是什么:索引是一种数据结构,数据结构是计算机存储.组织数据的方式,是指相互之间存在一种或多种特定关系 ...

  9. javaCV开发详解之12:视频转apng动态图片实现,支持透明通道,也支持摄像机、桌面屏幕、流媒体等视频源转apng动态图

    wjavaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG. ...

  10. postman切换环境

    原文链接:https://www.cnblogs.com/nicole-zhang/p/11498384.html 通常会有多个测试环境,针对同一个接口来说,可能只是域名有变化,此时可以添加postm ...