STL整理之map

转载请注明出处,部分内容引自李煜东《算法竞赛进阶指南》


前置知识: C++C C + + 、 C 语言入门


Map M a p 是什么

Map是从键( key k e y )到值( value v a l u e )的映射,其内部实现是一棵以 key k e y 为关键码的红黑树

Map M a p 的相关操作

头文件

#include<map>

声明:

像这样:

map<key的类型,value的类型>名称;

比如:

map<long long,bool>mp;
map<string,int>mp;
map<pair<int,int>,vector<int>>mp;

就像其他需要排序的数据类型一样, key k e y 为一个结构体的 map m a p ,需要重载小于号

struct pos{
    int x,y,s;
    string move[100];
};
map<pos,int>mp;
bool operator <(const pos &ai,const pos &bi)
{
    return (ai.x==bi.x)?ai.y>bi.y:ai.x>bi.x;
}

[]运算符

map m a p 重载了[]运算符, map[key] m a p [ k e y ] 返回 key k e y value v a l u e 的引用,时间复杂度 O(logn) O ( l o g n )

[]操作符是 map m a p 最吸引人的地方。我们可以很方便地通过 map[key] m a p [ k e y ] 来得到 key k e y 对应的 value v a l u e ,还可以对 map[key] m a p [ k e y ] 进行赋值操作,改变 key k e y 对应的 value v a l u e

若查找的 key k e y 不存在,则执行 map[key] m a p [ k e y ] 后, map m a p 会自动新建一个二元组 (key,zero) ( k e y , z e r o ) ,并返回 zero z e r o 的引用。

eg.
map<string,int>mp;
for(int i=1;i<=n;i++)
{
    string s;
    int num;
    cin>>s>>num;
    mp[s]=num;
}
for(int i=1;i<=m;i++)
{
    string s;
    cin>>s;
    cout<<mp[s]<<endl;
}

map.size() m a p . s i z e ( )

统计 map m a p 中元素个数,函数返回一个整形变量,表示 map m a p 中元素个数,时间复杂度 O(1) O ( 1 )

用法:名称.size();
eg.
int num=mp.size();

map.empty() m a p . e m p t y ( )

检查 map m a p 是否为空,返回一个 bool b o o l 型变量,1表示 map m a p 为空,否则为非空,时间复杂度 O(1) O ( 1 )

用法:名称.empty();
eg.
if(mp.empty())
    cout<<"Mymap is Empty."<<endl;

map.clear() m a p . c l e a r ( )

清空 map m a p ,无返回值

用法:名称.clear();
eg.
mp.clear();

map.count(x) m a p . c o u n t ( x )

返回 map m a p key k e y x x 的元素个数,时间复杂度为O(logn)

用法:名称.count(x)
eg.
if(!mp.count(x))
    mp[x]=1;

迭代器

双向访问迭代器,不支持随机访问,支持星号解除引用,仅支持“++”,“–”这两个算术操作

引用和操作:

map<类型,类型>::iterator it;
eg.
map<int,int>::iterator it=mp.begin();
it++;
it--;

若把 it++ i t + + ,则 it i t 将会指向“下一个”元素。这里的下一个是指在 key k e y 从小到大排序的结果中,排在 it i t 下一名的元素。同理,若把 it i t − − ,则 it i t 会指向排在上一个的元素

“++”,“–”操作的复杂度均为 O(logn) O ( l o g n )

map m a p 的迭代器解除引用后,将得到一个二元组 pair<...,...> p a i r < . . . , . . . >

遍历 map m a p 及访问其中的元素
for(map<int,int>::iterator it=mp.begin();it!=mp.end();it++)
    if(it->second==ans)     //访问二元组中第二个,即value
        cout<<it->first<<endl;      //访问key

map.find(x) m a p . f i n d ( x )

map m a p 中查找 key k e y x x 的二元组,并返回指向该二元组的迭代器,若不存在,返回map.end(),时间复杂度为 O(logn) O ( l o g n )

用法:名称.find(x);
eg.
if(mp.find(s)!=mp.end())
    cout<<"Have Found!"<<endl;

map.insert(pair<...,...>) m a p . i n s e r t ( p a i r < . . . , . . . > )

map m a p 中插入,参数是 pair<key.type,value.type> p a i r < k e y . t y p e , v a l u e . t y p e > ,返回插入地址的迭代器和是否插入成功的 bool b o o l 并成的 pair p a i r ,时间复杂度为 O(logn) O ( l o g n )

PS: insert i n s e r t 在进行插入的时候是不允许有重复的键值的,如果新插入的键值与原有的键值重复则插入无效

用法:名称.insert(pair<key的类型,value的类型>);
eg.
mp.insert(make_pair(2,3));

map.erase() m a p . e r a s e ( 参 数 )

删除,参数可以是 pair p a i r 或者迭代器,返回下一个元素的迭代器,时间复杂度为 O(logn) O ( l o g n )

用法:名称.erase(参数);
eg.
map<int,int>::iterator it=mp.begin();
mp.erase(it);
mp.erase(make_pair(2,3));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值