zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    守护进程、互斥锁、生产者消费者模型
    实现并发编程的基础理论
    udp协议
    进程与进程池
    tcp协议产生-粘包问题的解决方案
    day21面向对象_类
    day16_面向过程编程与模块导入
    day15_函数递归_匿名函数_内置函数
    三、运算符(阶段二)
    二、(续)基础语法--常量、变量和注释(阶段二)
  • 原文地址:https://www.cnblogs.com/Poetic-Rain/p/13065105.html
Copyright © 2011-2022 走看看