STL源码剖析
STL源码剖析
Revendell
分布式数据库内核开发
展开
-
21配接器(adapters)
0、前言STL的六大组件,容器是以类模板完成,算法是以函数模板完成,仿函数是一种将operator()重载的类模板,迭代器是一种将operator++和operator*等指针习惯行为重载的类模板,配接器则复杂很多不同配接器实现不同,容器配接器和迭代器配接器是一种类模板,函数配接器是一种函数模板。1、配接器概述与分类配接器的定义:将一个class的接口转换为另一个class的接口,使得原本接口不兼容而不能合作的class可以一起运作。配接器在STL组件的灵活组合运用功能上,扮演着轴承、转接器的角原创 2020-12-06 23:16:55 · 216 阅读 · 0 评论 -
20仿函数(functors)
1、仿函数概述仿函数(functors)是早期的命名,新名称是函数对象(function objects)。函数对象是指一种具有函数特质的对象,所以仿函数的本质就是一个行为类似函数的对象,仿函数主要用途是搭配STL算法。这种东西在调用者可以像函数一样地被调用,在被调用者则以对象所定义的function call operator()扮演函数的实质角色。仿函数相比于函数指针的优势在于函数指针不能满足STL对抽象性的要求也不满足软件积木的要求,函数指针无法和STL其他组件搭配,产生更灵活的变化。STL仿原创 2020-12-06 15:59:39 · 394 阅读 · 0 评论 -
19其他算法(algo)——复杂的算法
1、一些复杂的算法例如:lower_bound、upper_bound、binary_search、next_permutation、prev_permutation、random_shuffle、partial_sort、partial_sort_copy、sort、equal_range、inplace_merge、nth_element、merge sort等。2、lower_bound这是二分查找的一种版本,在已排序的[first,last)中寻找大于等于value的第一个元素,返回该元原创 2020-12-05 23:35:40 · 715 阅读 · 0 评论 -
18其他算法(algo)——单纯的数据处理
1、单纯的数据处理有一些算法是只进行单纯的数据移动、线性查找、计数、循环遍历、逐一对元素施行指定运算等操作。这些算法运作逻辑都相对单纯、直观且易懂。2、adjacent_find找出第一组满足条件的相邻元素。在版本一中是相邻两元素相等,在版本二中是用户指定一个二元运算,两个操作数分别是相邻的两个元素。template <class ForwardIterator>ForwardIterator adjacent_find(ForwardIterator first, Forw原创 2020-11-30 22:23:26 · 528 阅读 · 0 评论 -
17set相关算法
1、set相关算法STL一共提供了四种与set(集合)相关的算法,分别是并集(union)、交集(intersection)、差集(difference)、对称差集(symmetric difference)。这四种算法所接受的set,必须是有序区间,元素允许重复,所以可以接受STL的set和mutiset容器作为输入区间。2、set_union算法set_union可构造S1、S2的并集。set_union是一种稳定操作,输入区间内的每个元素的相对顺序都不会改变。在两区间内分别移动迭代器。原创 2020-11-26 23:31:04 · 249 阅读 · 0 评论 -
16基本算法(algobase)
1、基本算法STL标准规格中并没有区分基本算法或复杂算法,然而SGI却把常用的一些算法定义于<stl_algobase.h>之中,其他算法定义于<stl_algo.h>中。常见的基本算法有equal、fill、fill_n、iter_swap、lexicographical_compare、max、min、mismatch、swap、copy、copy_backward等。2、equal3、fill4、fill_n5、iter_swap6、lexicograp原创 2020-11-26 22:37:26 · 225 阅读 · 0 评论 -
15数值算法(numeric)
1、算法概述算法,问题之解法也。再好的编程技巧,也无法让一个笨拙的算法起死回生。选择了错误的算法,便注定了失败的命运。STL中极具复用价值的70余个STL算法,包括赫赫有名的排序、查找、排列组合算法,以及用于数据移动、复制、删除、比较、组合、运算等算法。(1)质变算法——会改变操作对象的值质变算法是指运算过程中会更改区间内迭代器所指的元素内容。例如拷贝(copy)、互换(swap)、替换(replace)、填写(fill)、删除(remove)、排列组合(permutation)、分割(pa原创 2020-11-25 23:06:28 · 936 阅读 · 0 评论 -
14hash_set&hash_map
1、hash_setSTL set多半是以RB-tree为底层机制,SGI则是在STL标准规格之外又提供了一个hash_set,以hashtable为底层实现机制。由于hash_set所供应的操作接口,hashtable都提供了,所以几乎所有的hash_set操作行为,都只是转调用hashtable的操作行为而已。RB-tree有自动排序功能而hashtable没有,反应出来的结果就是,set元素有自动排序功能而hash_set没有。hashtable有一些无法处理的型别,除非用户为那些型别撰写散列函数原创 2020-11-24 23:36:43 · 115 阅读 · 0 评论 -
13hashtable
1、hashtable概述hashtable被视为一种字典结构(dictionary),这种结构可以提供常数时间O(logN)的基本操作,就像stack或queue那样。能带来这种O(logN)实现的关键是散列函数(hash function),使用散列函数会带来一个问题:可能有不同的元素被映射到相同的位置即有相同的索引。这无法避免,因为元素个数大于array容量,这便是碰撞问题。解决碰撞问题的方法有许多种,包括线性探测、二次探测、开链等。2、碰撞问题的解决方法(1)线性探测当散列函数计算出原创 2020-11-24 23:06:48 · 138 阅读 · 0 评论 -
12set&map
1、setset的特性是所有元素的键值自动被排序。set的元素不像map那样可以同时拥有实值value和键值key,set元素的键值就是实值,实值就是键值。set不允许两个元素有相同的键值。由于RB-tree是一种平衡二叉搜索树,自动排序的效果很不错,所以标准的STL set是以RB-tree为底层机制,几乎所有的set操作行为,都只是转调用RB-tree的操作行为而已。我们不能通过set的迭代器改变set的元素值,因为set元素值就是其键值,关系到set元素的排列规则,所以set<T>原创 2020-11-23 22:16:07 · 149 阅读 · 0 评论 -
11红黑树(RB-tree)
1、平衡二叉树平衡二叉树有许多种类型,包括AVL-tree、RB-tree、AA-tree,其中最被广泛运用于STL的是RB-tree(红黑树)。二叉搜索树的节点放置规则是:任何节点的键值一定大于其左子树中的每一个节点的键值,并小于其右子树中的每一个节点的键值。2、AVL-treeAVL-tree是一个“加上了额外平衡条件”的二叉搜索树,其平衡条件的建立是为了确保整棵树的深度为O(logN)。AVL-tree要求任何节点的左右子树高度相差最多1。由于只有插入点至根节点路径是哪个的各节点可能改变平原创 2020-11-22 23:57:14 · 294 阅读 · 0 评论 -
10单向链表(slist)
1、slist概述slist并不在标准规格之内,sllist和list的主要差别在于,slist的迭代器属于单向的Forward Iterator,而list的迭代器属于双向的Bidirectional Iterator。由于slist没有任何方便的办法可以回头定出前一个位置,必须从头找起,所以对于slist除了起点外其他位置采用insert和erase操作都属于不智之举,这是slist相较于list的大缺点。为此,slist特别提供了insert_after()和erase_after()供灵活运用。原创 2020-11-19 00:42:57 · 1358 阅读 · 0 评论 -
9优先队列(priority_queue)
1、priority_queue概述priority_queue是一个拥有权值观念的queue,它允许加入新元素、移除旧元素、审视元素值等功能。由于这是一个queue,所以只允许在底部加入元素,并从顶端取出元素,除此之外别无其他存取元素的途经。priority_queue带有权值观念,其内的元素并非依照被推入的次序排列,而是自动依照元素的权值排列,权值最高者,排在最前面。priority_queue是利用heap完成,heap是一个以vector表现的完全二叉树。priority_queue是以he原创 2020-11-19 00:10:12 · 164 阅读 · 0 评论 -
8堆(heap)
1、heap概述heap不属于STL容器组件,它以算法形式呈现,通过heap很方便实现priority queue。priority queue允许用户以任何次序将任何元素推入容器中,但取出时一定是从优先级最高也就是数值最高的元素开始取出,heap正是具有这样的特性,适合作为priority queue的底层实现。heap不提供遍历,也不提供迭代器。为什么使用heap作为priority queue的底层实现?如果使用list作为priority queue的底层实现,那么元素插入可以享受常数时间,原创 2020-11-18 23:13:22 · 158 阅读 · 0 评论 -
7队列(queue)
1、queue概述queue是一种先进先出(FIFO)的数据结构,queue允许新增元素、移除元素、从最底端加入元素、取最顶端元素,但除了最底端可以加入元素最顶端可以取出外不允许存取其他元素所以不允许有遍历行为。queue的底层实现机制是deque,deque是双向开口的数据结构只要封闭其头端的入口和底端的出口便可以轻而易举实现queue。queue是以deque为底部容器完成所有工作,所以queue是配接器(adapter)。queue不提供遍历功能,也不提供迭代器。template <原创 2020-11-18 21:15:26 · 143 阅读 · 0 评论 -
6栈(stack)
1、stack概述stack是一种先进后出(FILO)的数据结构,stack允许新增元素、移除元素、取最顶端元素,但不允许取除最顶端外其他元素所以不允许有遍历行为。stack的底层实现机制是deque,deque是双向开口的数据结构只要封闭其头端开口便可以轻而易举实现stack。stack是以deque为底部容器完成所有工作,所以stack是配接器(adapter)。stack不提供走访功能,也不提供迭代器。template <class T, class Sequence = deque&原创 2020-11-18 20:58:51 · 108 阅读 · 0 评论 -
5双向队列(deque)
1、deque概述deque是一种双向开口的连续线性空间,而vector是单向开口的连续线性空间,deque和vector的最大差异,一在于deque允许于常数时间内对起头端进行元素的插入或移除操作,二在于deque没有容量(capacity)观念,因为它是动态地以分段连续空间组合而成,随时可以增加一段新空间并链接起来。deque的迭代器也是Random Access Iterator,但不是普通指针,其复杂度和vector不可以道里计。2、deque迭代器deque是由一段一段的定量连续空间构原创 2020-11-17 21:23:46 · 396 阅读 · 0 评论 -
4双向链表(list)
1、list概述2、list迭代器3、list数据结构4、list构造与内存管理5、list元素操作原创 2020-11-13 23:12:48 · 399 阅读 · 0 评论 -
3容器(vector)
1、vector概述vector与array非常相似,两者唯一差别在于空间的运用的灵活性。array是静态空间,一旦配置了就不能改变;vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。vector的实现技术关键在于其对大小的控制以及重新配置时的数据移动效率,一旦vector旧空间满载扩充空间将会是“配置新空间/数据移动/释放旧空间”的大工程。2、vector数据结构vector所采用的数据结构非常简单:线性连续空间。它以两个迭代器start和finish分别指向配置原创 2020-11-10 00:57:18 · 98 阅读 · 0 评论 -
2迭代器(iterators)
1、迭代器(iterators)iterators模式定义:提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器内部的表述方式。STL的中心思想在于:将数据容器和算法分开,彼此独立设计,最后再以一种胶着剂将它们撮合在一起,迭代器就是容器和算法之间的胶着剂。迭代器是一种行为类似指针的对象,指针最常见的行为是引用解析(operator*)和成员访问(operator->),因此迭代器最重要的工作就是对operator*和operator->进行重载。2、迭代器的相原创 2020-11-08 23:18:37 · 410 阅读 · 0 评论 -
1空间配置器(allocator)
1、空间配置器(allocator)STL将空间配置器定义于<memory>之中,<memory>内包含两个文件<stl_alloc.h>和<stl_construct.h>,一个负责内存空间的配置和释放另一个负责对象内容的构造与析构。<stl_construct.h>:这里定义了全局函数construct()和destroy()负责对象的构造和析构 <stl_alloc.h>:这里定义了一、二级配置器,彼此合作负责内存空间的原创 2020-11-07 22:42:29 · 182 阅读 · 0 评论