STL源代码剖析
文章平均质量分 79
深入SGI-STL内部,剖析其实现机理。这样不仅可以学习语言,也可以学习专家是如何编程的。
有时需要偏执狂
一定要搞懂,千万不要心存侥幸,否则一些问题会让你痛苦不堪(源码面前,了无秘密)。
拥有一某三分地不容易,贵在坚持。
展开
-
STL之空间配置器详细讲解
需要搞清楚空间配置器之前必须分清楚C++中各种内存分配和释放的区别?大型开源项目一般喜欢加上一个自己喜欢的内存池,哈哈 ,貌似可以解决一些内存碎片的功能,但是不知道效果大不大。到目前为止,我知道libevent里面没有使用内存池但是自己可以实现一个,给它使用;Nignx里面自己实现了内存池。可以先看看自己如何实现一个内存池功能SGI含有两个空间配置器类,std::allocator内存...原创 2018-01-31 21:06:27 · 1242 阅读 · 0 评论 -
STL中迭代器与traits编程的技巧
迭代器设计模式1、什么是迭代器? 一种抽象的设计概念,iterator模式定义就是提供一种方法,使之能够依序访问某个容器所有的各个元素,而又不用暴露容器内部的表达方式。2、迭代器如何实现? 在内部就是通过指针实现迭代器,将编程全部泛化,抽象出共同拥有的东西,可以提供类似指针的操作,实质上就是操作符重载,实现对容器内部数据的操作功能。在STL中,如果将迭代器独立出来设计,那...原创 2018-01-16 21:42:26 · 370 阅读 · 1 评论 -
STL之vector实现详解
array、list、tree、stack、queue、hash table、set、map这些全部都是数据结构,根据数据在容器之中的排列特性,这些数据结构分为序列式和关联式两种。 序列式容器就是其中的元素都是可序的但是不一定有序。vector首先从一个简单例子入手,说明vector如何是使用的。vector使用示例include<vector>#i...原创 2018-01-20 10:40:03 · 1216 阅读 · 3 评论 -
STL之list实现详解
STL中的list容器底层数据结构用的是双向链表。这样数据在存储和删除的时候都可以做到时间复杂度是O(1)。但是由于其存储空间并不是连续的,所以导致在里面查找数据会很不容易。1、介绍list如何使用的demo#include <iostream>#include <list>#include <algorithm>#include <...原创 2018-03-11 21:30:06 · 1428 阅读 · 0 评论 -
STL之deque实现详解
何为dequedeque是双向开口的连续线性空间(动态将多个连续空间通过指针数组接合在一起),随时可以增加一段新的空间,所以数据想vector里面的分配,复制,释放操作不会发生。deque头尾两端分别做插入和删除操作都是常数时间。能用vector尽量使用vector,通过deque用来做队列即可,十分方便的。不浮躁,慢慢看,就会理解其中的奥妙。 花了半天的时间仔细看了一遍SGI-STLd...原创 2018-03-13 14:56:27 · 30182 阅读 · 7 评论 -
STL之stack实现详解
STL栈介绍stack是先进先出,没有迭代器,只允许push和pop操作以及读取和修改栈顶top元素的操作。由于stack利用了底层容器实现工作,所以称之为配接器而已。 栈的完整定义#define __STL_NULL_TMPL_ARGS <> //模板传入的是一个类template <class T, class Sequence = deque<T...原创 2018-03-13 14:57:28 · 3228 阅读 · 1 评论 -
STL之queue实现详解
队列承接上节栈的讲解,因为实现的list和dqueue这种双进双出的底层容器,那么对于queue这种适配器,实现起来就非常简单了。queue具有先进先出的数据结构。仅仅支持新增元素、移除元素、从最底端加入元素、取最顶端元素。这些方法而已。只要细心分析了deque,这个适配器就很容易了。 STL-queue实现起来非常简单,那么直接给出源代码,解释其中比较重要的地方。 队列不提供迭代...原创 2018-03-15 21:35:22 · 7005 阅读 · 0 评论 -
STL之heap实现详解(内部使用)
堆先前的文章已经对堆说得足够清楚了,可以参考。 可以参考 libevent之最小堆 经典排序算法堆无非就是分为最大堆(父节点大于等于子节点)和最小堆(父节点小于等于子节点)。STL里面实现的都是最大堆。还有就是堆一般通过数组实现。那么问题就有两个。假如不用数组索引0的位置,那么算法会很简单,那么N的父节点索引就是N/2;N的左右子节点分别是2N和2N+1。假如使用了索引0位置,那么N...原创 2018-03-16 22:09:05 · 2073 阅读 · 1 评论 -
STL之hashtable详解
hash介绍前面讲解二叉树实现键和值的存储。平衡二叉树就是插入和搜寻的速度非常快。那么我们是否可以使用一种方法,将键和值都存在在一段连续的空间内呢?可以,我们只需要将键通过一个函数映射成一个整数即可。这样在时间和空间上面做到了平衡,因为查找很快,索引也很快。关键在于散列函数和碰撞处理,很简单,具体可以参考。 **碰撞处理主要是线性分离(通过链表处理)和线性探测。**SGI-STL采用了线性分...原创 2018-03-24 21:24:02 · 4074 阅读 · 2 评论 -
STL之仿函数实现详解
1、何为仿函数仿函数的主要功能是为了搭配STL算法使用,单独使用仿函数的情况比较少。 仿函数(functors)在C++标准中采用的名称是函数对象(function objects)。仿函数主要用于STL中的算法中,虽然函数指针虽然也可以作为算法的参数,但是函数指针不能满足STL对抽象性的要求,也不能满足软件积木的要求–函数指针无法和STL其他组件搭配,产生更灵活变化。仿函数本质就是类重载了...原创 2018-03-28 21:34:19 · 22863 阅读 · 4 评论 -
STL之算法模板函数实现详解
1、<algorithm>1、transformtemplate <class InputIterator, class OutputIterator, class UnaryOperation>OutputIterator transform(InputIterator first, InputIterator last, ...原创 2018-04-09 21:39:46 · 584 阅读 · 0 评论 -
STL之hash_set和hash_multiset、hash_map和hash_multimap详解
hash_set1、介绍 虽然STL只规范复杂度和接口,并不规范实现方法,但STL set多半以RB-tree为底层机制。SGI在标准之外提供了hash_set,以hashtable作为底层机制。用set为的是能快速搜寻元素。这一点无论底层是RB-tree还是hashtable都能实现。但RB-tree有自动排序能力(二叉树特性)而hashtable(肯定没有啊)没有,其结果就是set元...原创 2018-03-24 22:06:47 · 728 阅读 · 0 评论 -
STL之set和multiset、 map和multimap详解
基本用法参考这篇,本篇主要讲解内部实现过程。set和multiset介绍set/multiset以底层红黑树为结构,set的key和value是合一的,value就是key,因此通过比较key插入平衡二叉树,因此可以可以通过迭代器,从小到大输出key,也就是所谓的自动排序,二叉树以及排好序了。禁止通过迭代器修改key,否则二叉树结构变化了。特性和set集合差不多,唯一的区别就在于允许键...原创 2018-03-21 19:03:04 · 1419 阅读 · 0 评论 -
STL之tree的实现详解
1、红黑树介绍关联容器都有一个key(键)和一个value(值)。当元素被插入到关联式容器中时,内部结构依照其键值的大小,以特定的规则将元素放到合适的位置(实现查找算法吧)。 一般关联时容器内部结构是一个平衡二叉树,用于在恶劣的环境下获得良好的搜寻效率。平衡二叉树的实现有:AVL-tree、RB-tree、AA-tree。用的最广的就是RB-tree,不论是在Nginx还是Linux内核任务...原创 2018-03-17 21:46:27 · 11072 阅读 · 1 评论