
STL
文章平均质量分 94
jelly_9
快速采集信息,高效整理,根据逻辑建立成一个系统。
展开
-
插入排序
将一个元素插入到一个有序序列中,使插入之后的序列仍然有序,是插入排序的核心思想。 概述插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据。我们将待排序数组分为前(有序)后(无序)两部分,每次从后一部分取一个数据,然后在前一部分找其对应位置,找到后将其置入,然后增加有序部分的长度,持续这样的操作,直到整个序列有序。原理详解以排升序为例。如上图所示,插入排原创 2017-12-12 10:31:28 · 162 阅读 · 0 评论 -
红黑树 (附 STL 源码学习注释)
除了 AVL 树之外,另一个颇具历史并被广泛运用的平衡二叉搜索树是红黑树。同 AVL 树一样,红黑树的高度也近似为 O(logN),它是通过给节点标记上两种不同的颜色 (红、黑) 来实现此目的的。 模拟实现代码 概述 红黑树是在1972年由 Rudolf Bayer 发明的,当时被称为平衡二叉B树(symmetric binary B-trees)。后来,在1978年被 ...原创 2017-11-27 12:21:07 · 873 阅读 · 0 评论 -
set算法 (交集,并集,差集,对称差集)
set是以种以红黑树作为底部结构的关联式容器,它查找的平均时间复杂度可以达到 O(logN)。模拟实现 set 的代码 概述set 是一种关联式的容器,它的特点是:所有元素依照键值大小被排序。由于 set 内元素有序的特点,所以以红黑树作为它的底部容器最合适不过了。set 中的值不允许被改变,原因是改变它的值会影响底部容器——红黑树的结构,而红黑树的调整则需要付出很大的代价。正因为如此,它具有很高的原创 2017-12-02 19:14:37 · 5369 阅读 · 0 评论 -
stl中map的使用
map是一种关联式容器,值以 键值对 "pair" 的形式储存,STL 的 map 以红黑树作为地底层结构。完整代码 概述map中的元素以键值对 (pair) 的形式被储存。键值对的第一元素 first 为键值, 第二元素 second 为实值,第一元素键值不允许被改变,原因是 map 内部元素依据键值排序,若改变键值会影响 map 的结构。而第二元素可以被改变。由于红黑树是一棵平衡二叉查找树,在查原创 2017-12-06 11:39:39 · 861 阅读 · 0 评论 -
哈希表 (桶)
之前博文提到的平衡二叉搜索树 (AVL 树 和 红黑树)可以在 O(logN) 的时间复杂度内进行增删等操作,下面要介绍的哈希表 (hashtable) 在增删等操作表现更为出色,时间复杂度为 O(1)。完整实现代码 概述不同于之前的树形数据结构,此处的哈希表是一种表 (或者字典) 结构,这种结构的好处是提供常数时间复杂度的基本操作,就像数组那样,想要访问某个元素,通过下标一步就可以找到该元素。事实原创 2017-11-30 12:05:18 · 2329 阅读 · 1 评论 -
堆 (heap)
堆是一棵特殊的完全二叉树,由于这个特性,它的底层采用数组储存数据,这样,我们通过一个数组以及一组 heap 算法就可以轻易地实现一个堆。完整实现代码 概述根据数组的特点,我们使用一个技巧。如果将 #i 处的元素看作根,则它的左右子树分别为 #(2*i+1) 和 #(2*i+2),这样堆就可定义如下: 堆总是一棵完全二叉树; 对于大堆,树中每个节点的值总是大于其左右孩子节点的值,对于小堆,树中每个节点原创 2017-11-16 18:41:53 · 328 阅读 · 0 评论 -
双端队列 (deque)
除了我们常见的的 vector 和 list 之外,还有一种序列式容器 deque。它是一种双向开口的连续线性空间,双向开口意味着你可以在它的头部,尾部任意插入元素,连续线性意味着它底层如同 vector 那样是“连续”的空间。 - 完整实现代码 概述我们知道 vector 底层是一块连续的空间, 正因为如此它的迭代器及其简单,仅仅是一个 T* 类型的指针,它的缺点也显而易见——头插数据的效率原创 2017-10-22 16:17:13 · 840 阅读 · 0 评论 -
队列 (queue)
完整实现代码 概述队列是一种先进先出 (FIFO) 的数据结构,它允许在一端插入数据,在另一端删除数据。最先进入队列的数据最先出队列。除此之外,队列还允许访问队头元素和队尾元素、获取队列长度和判断空列队等操作。 队列不提供遍历的方法,也不提供迭代器。 如上图所示,插入操作将新的数据元素插到队尾,删除操作则将队头数据元素删掉,这种结构即可保证最先进入队列的数据元素可以最先出队列。队列操作 pu原创 2017-10-10 21:25:54 · 684 阅读 · 0 评论 -
栈 (stack)
stack 是一种后进先出 ( LIFO ) 的数据结构,它对外只开放一个叫做栈顶的口,数据从栈顶入,也从栈顶出,也不允许有遍历的行为。完整实现代码 概述 栈是一种运算受限的序列式容器,它的行为被限定在只能在一端进行增删操作,我们把这一端称为栈顶,相对的另一端为栈底。栈的插入 (push()) 操作又被称为 “入栈” ,新来的数据元素只能被插到栈顶。删除 (pop()) 操作又称为“出栈”,出栈时原创 2017-10-10 19:42:37 · 435 阅读 · 0 评论 -
list
本篇将介绍 STL 中 list 的使用及实现原理 list是一种序列式容器,它采用链式结构,其中的元素采用节点方式储存,每个节点独占“一块”内存,它对于空间的运用有绝对的精准,一点也不会浪费。为什么呢?如下:完整实现代码 list概述我们知道,vector中的数据是连续的储存在一块静态内存上,而此处的list与之不同,它使用“节点”的方式储存数据,节点之间采用指针链接。每一个数据独占一个节点,原创 2017-09-30 17:15:34 · 470 阅读 · 0 评论 -
vector
vector是STL诸多序列式容器之一,它可以像数组那样操作其中所储存的元素,不过vector的威力不止于此,它可是一个“智能数组”,为什么呢?以下:完整实现代码 概述我们都知道,如果你定义一个大小为10的整形数组,那么,在该数组的整个生命中,它的大小就永远只能是10,它是静态的。想要换个更大(也可能是更小)的房子,一切的琐碎事务都需要你手动完成(配置新数组空间+搬移旧数组数据+释放旧数组空间)。然原创 2017-09-29 20:40:56 · 327 阅读 · 0 评论 -
AVL树详解
假设有如下一棵二叉树树,为一棵单枝树,而且在以后的插入操作中由于特殊情况使插入节点比树中任意节点都大,它的这种特性继续保持,那么会发生什么情况? 这棵树将蜕化为链表,它的高度将等于树中节点个数N,所有的查找操作、删除操作时间复杂度变为O(N),而且大部分的储存空间被浪费。对于二叉树,我们期望它的高度是O(logN),这样对于它的绝大多数操作的时间复杂度将保持在O (logN)以内。 为了避免上述原创 2017-05-21 17:47:27 · 993 阅读 · 0 评论 -
冒泡排序
概述冒泡排序 (bubble_sort) 是计算机领域最经典的一种排序算法,它重复走访要排序的序列,每次比较相邻的两个元素,若次序错误就交换它们,直到整个序列有序。 由于冒泡排序每趟通过交换可以将最大(小)元素换至尾端,类似水中逐渐浮起的水泡,故以此得名。原理以排升序为例: 如上图所示,其排序步骤如下: 从前至后依次比较相邻元素,若它们的次序错误就交换其位置,直至比较到数组最后一个元素原创 2017-12-10 19:22:01 · 272 阅读 · 0 评论