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;
}
posted @ 2020-06-08 13:14  Poetic_Rain  阅读(84)  评论(0编辑  收藏  举报