关于map与unorderedmap_map的一些小操作

关于map与unorderedmap_map的一些小操作

map的简单应用

  • 简单介绍

首先map内部是由红黑树实现的,所以他的很多操作都是 \(log\) 级别的,并且内部实有序并且按键值作为排序关键字,但是mapclear()线性时间复杂度的,所以不推荐使用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)\) ),但是哈希表的建立较为消耗时间较为适合处理查找问题。

  • 基本操作

image

  • 重点介绍

同样的,clear是一个大问题,当我们确实想要清空的时候怎么办的?clear复杂度太高怎么办呢?

这时,我们就可以有如下的操作:

	unordered_map<int,int> tmp;
	a.swap(tmp);

我们可以直接建立一个 \(tmp\) ,然后直接swap,这样为什么更好呢?
因为swap内部好像是指针的操作,会快很多

这样clear的等价操作就大功告成了!

posted @ 2021-08-06 15:59  不会飞的小飞龙  阅读(93)  评论(0编辑  收藏  举报
Live2D