关于map与unorderedmap_map的一些小操作
关于map与unorderedmap_map的一些小操作
map的简单应用
- 简单介绍
首先map
内部是由红黑树实现的,所以他的很多操作都是 \(log\) 级别的,并且内部实有序并且按键值作为排序关键字,但是map
的clear()
是线性时间复杂度的,所以不推荐使用clear()
- 基本操作
他的基本的几个函数我就不在这里赘述了,就说一下他的遍历吧,也是非常简单的操作
map<int ,int >q;
//方法一
for(auto &it:q){
cout<<it.first<<" "<<it.second<<endl;
}
//方法二
for (map<int,int>::iterator it=q.begin();it!=q.end();it++){
cout<< it->first <<" "<< it->second <<endl;
}
- 重点介绍
不知道你有没有遇到这样的场景
这个题好水呀,看我直接秒切!
我可以用一个结构体来表示当前的点
包含两个变量 \(x\) \(y\) 来表示坐标
直接判断是否存在不就完了
大功告成!就这?
这题我马上就能秒切!
(本故事根据真人事迹改编)
但是,就在这时,你写完了大半代码,就差临门一脚,怎样判断呢?
你这时想起了失传已久的 \(map\)
所以你想拿 \(map\) 练练手
但是最关键的问题来了,你发现,用结构体作为map
的键值报错了!
才疏学浅的你被 \(map\) 直接上了一课
纳尼!!(ÒωÓױ)!??(・◇・)?
woc
!\(%#^%^\)&%@#$#%&%&^%*
.......
真相只有一个!(心机之蛙一直摸你肚子!)
我们可以看map的原形:
template <
class Key,
class T,
class Compare = less<Key>,
class Alloc = alloc>
class map{
...
}
我们可以发现模板参数一共有四个,第一个就是 \(Key\) ,即键;第二个就是值;第四个就是空间配置器,默认使用alloc(随STL版本不同而不同)。
那么第三个是什么呢?
首先我们可以顾名思义 compare
是比较的意思(因为博主英语水过于强大,这点英文不在话下!),所以我们大胆猜测是一个用来比较的模板参数,但是是用来比较怕什么的呢?
我们在一开始说过,map
内部是由红黑树实现的,而且是保证内部有序的,所以在进行插入时,会按照一定的规则把新元素插入特定位置,相应的,进行删除操作时,也会按一定规则修改树的结构。而这时候插入删除之间的节点比较是怎么实现的呢?这就是第三个模板参数存在的意义。
所以我们再次大胆猜测,那我们是不是没有结构体的比较规则,所以不能用struct
作为键值呢?
确实
所以我们可以这么操作:
struct node{
int x,y;
bool operator <(const node &o) const
{
return x < o.x || y < o.y;
}
};
map<node,int>q;
这样我们就可以用结构体来作为键值存入map
中了。
unordered_map的简单应用
- 简单介绍
unordered_map
再次顾名思义就是无序的,不同于map
的是,他内部是由哈希表来实现的,所以它使得查找速度极快(常数时间 \(O(1)\) ),但是哈希表的建立较为消耗时间较为适合处理查找问题。
- 基本操作
- 重点介绍
同样的,clear
是一个大问题,当我们确实想要清空的时候怎么办的?clear
复杂度太高怎么办呢?
这时,我们就可以有如下的操作:
unordered_map<int,int> tmp;
a.swap(tmp);
我们可以直接建立一个 \(tmp\) ,然后直接swap
,这样为什么更好呢?
因为swap
内部好像是指针的操作,会快很多
这样clear
的等价操作就大功告成了!
本文来自博客园,作者:不会飞的小飞龙,转载请注明原文链接:https://www.cnblogs.com/xiaofeilong7816/p/15109000.html