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. (Java实现) 数塔问题

    数塔问题(使用动态规划思路求解) 如图所示,给定一个正整数构成的三角形,如下所示: 在下面的数字三角形中寻找一条从顶部到底边的路径, 使得路径上所经过的数字之和最大. 路径上的每一步都只能往左下或者右 ...

  2. Java实现 LeetCode 151 翻转字符串里的单词

    151. 翻转字符串里的单词 给定一个字符串,逐个翻转字符串中的每个单词. 示例 1: 输入: "the sky is blue" 输出: "blue is sky th ...

  3. Java实现 LeetCode 76 最小覆盖子串

    76. 最小覆盖子串 给你一个字符串 S.一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBANC", T = ...

  4. Java实现 洛谷 P1055 ISBN号码

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public ...

  5. java实现第五届蓝桥杯供水设施

    供水设施 X星球的居民点很多.Pear决定修建一个浩大的水利工程,以解决他管辖的N个居民点的供水问题.现在一共有N个水塔,同时也有N个居民点,居民点在北侧从1号到N号自西向东排成一排:水塔在南侧也从1 ...

  6. Docker安装及阿里云镜像加速器配置

    Docker安装 Windows系统安装就不用说了,因为Docker是开源的,所以,直接去官网:https://www.docker.com/下载安装包安装就行了 其实,Linux系统安装也很简单,照 ...

  7. Python爬虫 爬取搜狗搜索到的内容页面

    废话不多说,直接上代码 import requests def main(): url='https://www.sogou.com/web' headers={ 'User_Agent':'Mozi ...

  8. kka-typed(5) - cluster:集群节点状态监视

    akka-cluster对每个节点的每种状态变化都会在系统消息队列里发布相关的事件.通过订阅有关节点状态变化的消息就可以获取每个节点的状态.这部分已经在之前关于akka-cluster的讨论里介绍过了 ...

  9. Python 读取和输出到txt

    读txt文件 python常用的读取文件函数有三种read().readline().readlines() read() #一次性读取文本中全部的内容,以字符串的形式返回结果 with open(& ...

  10. 【C#】AutoMapper 使用手册

    目录 1 入门例子 2 注册 2.1 Profile 3 配置 3.1 命名约定 3.2 配置可见性 3.3 全局属性/字段过滤 3.4 识别前缀和后缀 3.5 替换字符 4 调用构造函数 5 数组和 ...