重读STL源码剖析:map与set

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

时间: 2024-10-14 20:55:46

重读STL源码剖析:map与set的相关文章

重读STL源码剖析:deque

deque deque是一种双向开头的现行连续空间 但它与vector有差异: 1.deque可以在O(1)的复杂度下进行头端插入与移除,而vector的头端操作效率极差 2.deque没有capacity概念.deque随时可以拼接一段新的连续空间.只有像vector这种可能出现空间不足的容器才需要capacity与reserve的概念.包括list也是不需要capacity与reserve的. 3.vector的迭代器是简单的T*型指针,而deque比这复杂得多,虽然也是Random Acc

重读STL源码剖析:析构

纯虚析构函数 理论上来说,将一个函数声明为纯虚函数后,这个类即变为抽象类.纯虚函数只提供接口,而不提供实现,但纯虚析构函数一定要提供定义.这是由C++特性决定的,编译器对派生类的析构函数会进行扩展,以静态调用的方式调用其每一个虚基类和上基类的析构函数,尽管是一个抽象类,但仍然要为这个纯虚析构提供实现,即使是awov::~awov() {} 这样没有任何操作的实现,因为如果不提供,将导致链接失败 虚函数与内联 内联函数是一种静态行为,由编译器在调用地点展开,这是在编译期进行的:而虚函数是一种动态行

《STL源码剖析》---stl_pair.h阅读笔记

pair是STL中的模板类型,它可以存储两个元素,它也被称作"对组".在map中已经用到了它,pair其实就是一个struct结构,存有两个public的元素,重载了几个运算符,没有什么成员函数,源代码很简单. G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_pair.h 完整列表 /* * * Copyright (c) 1994 * Hewlett-Packard Company * * Permission to use, copy,

《STL源码剖析》---stl_tree.h阅读笔记

STL中,关联式容器的内部结构是一颗平衡二叉树,以便获得良好的搜索效率.红黑树是平衡二叉树的一种,它不像AVL树那样要求绝对平衡,降低了对旋转的要求,但是其性能并没有下降很多,它的搜索.插入.删除都能以O(nlogn)时间完成.平衡可以在一次或者两次旋转解决,是"性价比"很高的平衡二叉树. RB-tree(red black tree)红黑树是平衡二叉树.它满足一下规则 (1)每个节点不是红色就是黑色. (2)根节点是黑色. (3)如果节点为红色,则其子节点比为黑色. (4)任何一个节

STL"源码"剖析-重点知识总结

STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略多 :) 1.STL概述 STL提供六大组件,彼此可以组合套用: 容器(Containers):各种数据结构,如:vector.list.deque.set.map.用来存放数据.从实现的角度来看,STL容器是一种class template. 算法(algorithms):各种常用算法,如:sort.search.copy.erase.从实现的角度来看,STL算法

通读《STL源码剖析》之后的一点读书笔记

[QQ群: 189191838,对算法和C++感兴趣可以进来] 直接逼入正题. Standard Template Library简称STL.STL可分为容器(containers).迭代器(iterators).空间配置器(allocator).配接器(adaptors).算法(algorithms).仿函数(functors)六个部分. 迭代器和泛型编程的思想在这里几乎用到了极致.模板或者泛型编程其实就是算法实现时不指定具体类型,而由调用的时候指定类型,进行特化.在STL中,迭代器保证了ST

【转载】STL&quot;源码&quot;剖析-重点知识总结

原文:STL"源码"剖析-重点知识总结 STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略多 :) 1.STL概述 STL提供六大组件,彼此可以组合套用: 容器(Containers):各种数据结构,如:vector.list.deque.set.map.用来存放数据.从实现的角度来看,STL容器是一种class template. 算法(algorithms):各种常用算法,如:sort.se

《STL源码剖析》---stl_deque.h阅读笔记(1)

双端队列deque是容器的一种.它比vector更强大,vector只可以在尾端插入元素,deque不只是可以再尾端插入,也可以在队列头插入.下面借助<STL源代码剖析>的图片讲解. 1.deque的内存结构 vector是开辟一段连续的内存,deque可以在前端插入元素,如果像vector开辟一段连续的内存,向前面插入元素不易维护.例如如果只是开辟一段连续内存,那么前端到开辟内存的起始位置要空多少个位置?当这段内存满了时,拷贝到更大内存时,前端空留多少位置?显然难以维护.deque在STL中

《STL源码剖析》---stl_deque.h阅读笔记(2)

看完,<STL源码剖析>---stl_deque.h阅读笔记(1)后,再看代码: G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_deque.h 完整列表 /* * * Copyright (c) 1994 * Hewlett-Packard Company * * Permission to use, copy, modify, distribute and sell this software * and its documentation fo