重读STL源码剖析:map与set

本文介绍红黑树(RBTree)的基本概念及其在C++标准模板库(STL)中的应用,包括set、map、multiset和multimap等容器的特点及区别。

map与set底层都是调用的RBTree

首先看RBTree

RBTree

红黑树的特性:

1.根节点为黑色

2.新增节点一定是红色

3.节点只有红色或黑色两种颜色

4.两个节点颜色不能同为红

5.任意一条路径上的黑色节点个数相同

红黑树的节点设计:

1.表示节点颜色的变量color

2.链接左子树的left指针

3.链接右子树的right指针

4.链接父节点的parent指针

5.表示节点值的变量value_field;在map中为pair对,在set中只有key

RBTree的迭代器:

1.属于双向迭代器

2.RBTree是有排序的,迭代器的++与--实际上是在二叉树上找下一个节点的过程

RBTree的数据结构:

1.一个指向头结点的指针header:

头结点:

在RBTree中维护一个头结点,这个头结点的父节点实际上是树的根节点,而树的根节点的父节点是这个头结点。

而头结点的左指针left指向整个树的最左节点,也就是最小值

头结点的右指针right指向整个树的最右节点,也就是最大值

2.node_count记录树的大小

3.一个用于比较元素大小的仿函数

insert_equal()与insert_unique:

insert_equal允许RBTree中存在相同的节点,进行插入时,小于当前节点则向左走;等于或等于则向右走;如果有相同的元素,则插在相同元素的右侧,比如9的右子节点有一个10,则在插入10就插入在这个10的右子节点

inert_unique不允许RBTree中存在相同的节点,在找到插入位置后,如果插入位置的父亲节点的值与待插入节点(插入一定插在一个空子树的位置)相同,则不插入.

 

Set

set的节点只拥有一个key值,因此是不可以修改的,否则会破坏RBTree的结构。

Set的特性与list一致,当插入或删除某个迭代器时,除了这个迭代器,其他的迭代器都不会失效.

Set以红黑树为底层,数据结构中存在一个红黑树变量t.

Map

map的节点是一个pair对,拥有key-value的特性,排序时根据key进行排序

与set一样,对迭代器的插入或删除不会影响其他迭代器

MultiSet与MultiMap

set与multiset;map与mutimap的用法都一致,只是multiset和multimap使用的是insert_equal.

 

转载于:https://www.cnblogs.com/lxy-xf/p/11525381.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值