本片文章讲解的map和set底层是红黑树,红黑树是一颗平衡二叉搜索树。set是key搜索场景的结构,map是key/value搜索场景的结构。
一、set系列的使用

我们将挑出重点来进行讲解。
1、insert和迭代器遍历

2、find和erase




3、区间




4、multiset和set
multiset和set的采用基本完全类似,主导区别点在于multiset支持值冗余,那么insert/find/count/erase都围绕着承受值冗余有所差异

a、相比于set,multiset只是排序但是不去重
b、x可能会存在多个,find查找中序的第一个
c、count会返回x的实际个数
d、erase给值时会删除所有的x
这个时候再看环形链表就可以轻松解决了,完全是降维打击
#include<list>
struct ListNode {
int val; // 节点值
ListNode *next; // 指向下一个节点的指针
// 构造函数,方便创建节点
ListNode(int x) : val(x), next(nullptr) {}
};
class Solution
{
public:
ListNode *detectCycle(ListNode *head)
{
set<ListNode*> s;
ListNode* cur = head;
while(cur)
{
// auto ret = s.insert(cur);
//if(ret.second == false)
// return cur;
if(s.count(cur))
return cur;
else
s.insert(cur);
cur= cur-> next;
}
return nullptr;
}
};
但注意要传的是地址,不是值
二、map系列的启用
Key是map底层关键字的类型,T是map底层value的类型,set默认要求Key支持小于比较,要是不支持或者需要的话能够自行实现仿函数传给第二个模板参数,map底层存储数据的内存是从空间配置器申请的。
1、pair类型介绍
map底层的红黑树节点的数据,使用pair<Key,T>存储键值对数据

make_pair是一个函数模板



2、map的迭代器和[ ]功能


·[]的能力有3个,插入,查找,修改

a、如果k不在map中,insert会插入k和mapped_type默认值,同时[]返回结点中存储mapped_type值的引用,那么大家通过引用修改返回值。所以它具备插入+修改
b、如果k在map中,插入失败啊,可是insert返回pair对象的first是指key结点的迭代器,返回值同时[]返回结点中存储mapped_type值的引用,所以它具备查找+修改
3、multimap和map的差异
使用基本类似,首要区别在于multimap拥护关键值key冗余,那么insert/find/count/erase都围绕着关键值key冗余有所差异。其次multimap不帮助[],因为支持key冗余[]只能帮助插入了,不能帮助修改。
浙公网安备 33010602011771号