c++stl之map(题目和总结)

前言:c++stl功能十分强大,map是其中一个功能十分强大的容器,要多刷题熟练它(为什么写完这段话感觉很装X),疫情太严重了,都不敢出门,只能在家愉(tong)快(ku)地刷题

一、 map用法总结

1.定义名为vis的map容器(int,int)类型

map<int,int>vis;

2.定义名为it的<正向>迭代器(int,int)类型
迭代器就是类似于数组下标的东西

map<int,int>::iterator it;

vis.begin()返回第一个迭代器,vis.end()返回最后一个迭代器的后一个
配套的遍历方法

for(it=vis.begin();it!=vis.end();it++)

3.定义名为iter的<反向>迭代器(int,int)类型

map<int,int>::reverse_iterator iter;

vis.rbegin()返回反向迭代器的第一个(相当于正向迭代器的最后一个),vis.rend()返回反向迭代器的最后一个的后一个(相当于正向迭代器的第一个的前一个)
遍历方法

for(iter=vis.rbegin();iter!=vis.rend();iter++)

4.清空map容器,这个好像queue,stack都没有

vis.clear();

5.用迭代器返回对应的键(key)和值(value)
键值对——vis[key]=value

map<int,int>vis;
map<int,int>::iterator it;
it=vis.begin()
it->first;//返回键
it->second;//返回值

6.find函数:返回键(key)对应的迭代器

map<int,int>::iterator it;
it=find(key);

7.erase删除

vis.erase(it);//it为需要删除的元素的迭代器

vis.erase(key);//key为欲删除的映射的键

8.size()这个好像是个容器都有,返回map中映射的次数

int cnt=vis.size();

9.定义二维数组(套娃)的map

map<ll,map<ll,int> >vis;

就可以把二维数组当键

10.键为结构体的map

#include <bits/stdc++.h>
using namespace std;
pair<int,int>p;
map<pair<string,int>,int >vis;
int x,y,n;
string s;
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>s>>y;
        vis[{s,y}]++;
    }
    map<pair<string,int>,int >::iterator it;
    for(it=vis.begin();it!=vis.end();it++)
    {
        printf("%s %d %d\n",it->first.first.c_str(),it->first.second,it->second);
    }
    return 0;
}

二、题目总结

CF4C Registration system

方法一:

开一个map,键存字符串,值存字符串是第几输入,再开个数组

查找字符串在不在map中,若在,将字符串存入并且输出OK;若不在,位置对应数组的值+1,,并且输出字符串和对应数组的值

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
map<string,int>m;
int co[100005];
int main()//
{
    int n;
    string str;
    cin>>n;
    map<string,int>::iterator it;
    for(int i=1;i<=n;i++)
    {
        cin>>str;
        it=m.find(str);//找键为str的
        if(it==m.end())//没找到
        {
            m[str]=i;//存储该字符串的位置
            cout<<"OK"<<endl;
        }
        else//如果找到了
        {
            int t=it->second;//t为键为str的值,也就是位置
            cout<<str<<++co[t]<<endl;
        }
    }
    return 0;
}

方法二:

键存字符串,值存字符串出现次数,找不到则直接输出OK并存起来,找到了直接输出键值对并且值+1

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
map<string,int>m;
int co[100005];
int main()//
{
    int n;
    string str;
    cin>>n;
    map<string,int>::iterator it;
    for(int i=1;i<=n;i++)
    {
        cin>>str;
        it=m.find(str);//找键为str的
        if(it==m.end())//没找到
        {
            m[str]=1;//存储该字符串出现的次数
            cout<<"OK"<<endl;
        }
        else//如果找到了
        {
            cout<<str<<m[str]++<<endl;//输出键——字符串和值——字符串出现次数并且次数+1
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhoucheng_123/article/details/104226007
今日推荐