本片文章讲解的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冗余[]只能帮助插入了,不能帮助修改。