C++ STL map的基本用法

C++ STL map的基本用法

  • 本文不涉及到mutlimap多重映射
  • 本文只涉及map的常见用法

关于map

map是一个巨大的桶,下标范围取决于关键字类型的范围

map是一种关联容器,map由两个部分组成,分别是键(Key)值(Value)

map的特点:每个键只能映射成一个值。

所谓映射,是指通过一个值(关键字)通过某种方式得到另一个值。这也是Map最大的特色

为什么使用Map

在某些题中,数据范围非常大, n n n有时会开到 1 0 8 10^8 108,而开数组或vector会占用很多额外的空间,有没有一种数据结构可以省下多余的空间而避免MLE,并且缩短遍历数组所用的时间避免TLE呢?

    在这种情况下,$map$是一种很好的容器,可以解决这种问题。
map的原理

想象一下,在网上查找东西的时候,如果想要查有关A的相关资料,如果内容合理,它一定会给出你相关的资料(除了广告),它的原理就是在已知的数据库中找到关键字对应的内容。

map的使用

提示:元素查找之前为重点内容,之后了解即可

以下默认使用using namespace std;

m a p 的定义 map的定义 map的定义
#include <map>       //头文件:map
map <Type1,Type2> Name;
//Type1和Type2是数据类型,可以是int/double/char甚至string和结构体
//                      都可以作为他的关键字(Type1)和值(Type2)

 例子:
map <int,int> MyMap;
m a p 的存值 map的存值 map的存值

方法1:直接使用下标

MyMap[Key]=Val;

例子:
MyMap[5] = 3;

map的存值也很简单,就像数组一样,在中括号内放下标,等号右边是值。

方法2:使用 i n s e r t insert insert函数

MyMap.insert({Key, Val});

例子:
MyMap.insert({5, 3});
与上文的 MyMap[5] = 3 等价

其中, k e y key key就是我们上文提到的关键字, V a l Val Val是上文我们提到的值

m a p 值的调用 map值的调用 map值的调用

直接用下标即可

cout << MyMap[Key];

Map容器名[关键字]就可以调取值了。

元素查找 元素查找 元素查找

其实Map支持迭代器

迭代器用法:

for(auto it=MyMap.begin();it!=MyMap.end();++it)
{
    cout << it->first << " " << it->second << endl;
}

这样就可以输出Map中使用过的关键字和值一一对应了。

元素查找:

auto it=MyMap.find(Val);
//auto关键字只能在 C++11 中使用,可在编译命令后加上-std=c++11

map<Type1,Type2> :: iterator it; //map的正向

如果没有找到,it的值就会是这个map容器的尾指针。

元素删除 元素删除 元素删除

MyMap.erase(MyMap_Del_Start,MyMap_Del_End);

其中,My_Map_Del_Start是删除的左边界(头指针),My_Map_Del_End是删除的右边界(尾指针)

map的练习

若想进一步了解map的具体实例,请移步至luogu P3613【深基15.例2】寄包柜(本人认为这是一个很好的map例题,虽然不难,但是可以很好的理解map的用法)。

示例代码(cpp):

#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,k,op;
map <pair<int,int>,int> FirMap;
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        cin>>op;
        if(op&1){   //op是奇数,二进制的最后一位
            cin>>x>>y>>k;
            pair<int,int> key=make_pair(x,y);
            FirMap[key]=k;
        }
        else{
            cin>>x>>y;
            pair<int,int> key=make_pair(x,y);
            cout<<FirMap[key]<<endl;
        }
    }
    return 0;
}

代码中涉及到的pair,请读者自行查阅资料,这里不做讲解。

希望这篇文章对你有帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值