简单C++标准模板库(STL)的实现
文章平均质量分 92
chengonghao
这个作者很懒,什么都没留下…
展开
-
SGI STL第二级空间配置器__default_alloc_template的chunk_alloc函数
SGISTL默认使用二级空间配置器,当需要配置的区块大于128 bytes时SGI STL调用一级空间配置器,一级空间配置器的allocate函数直接使用malloc分配内存,deallocate函数直接使用free释放内存。当需要配置的区块小于128 bytes时SGI STL调用二级空间配置器。 相比于一级空间配置器简单粗暴的内存使用方法,二级空间配置器对内存的使用显得精细原创 2016-05-08 17:15:44 · 1229 阅读 · 0 评论 -
STL 简单 function adapters 的实现
1. 配接器简介配接器(adapters)在 STL 组件的灵活组合上,扮演者轴承、转换的角色。Adapters事实上是一种设计模式(design pattern)。 百度百科对adapters模式的解释:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。——Gang of Four原创 2016-06-12 16:44:21 · 1426 阅读 · 0 评论 -
STL 简单 iterator adapters 的实现
1. 简介配接器(adapters)在STL组件的灵活组合上,扮演者轴承、转换的角色。Adapters事实上是一种设计模式(design pattern)。百度百科对adapters模式的解释:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。——Gang of Four 在STL的体系中,有原创 2016-06-09 21:56:55 · 1767 阅读 · 0 评论 -
STL 简单 functors(function objects)的实现
1.简介 本文介绍的东西,在STL历史上有两个不同的名称。仿函数(functors)是早期的命名,C++标准定案后,采用的新名称是函数对象(function objects)。 函数对象,顾名思义,首先是对象(后面我们可以看到,函数对象是用struct而不是class定义的),其次,我们可以像调用函数一样,调用函数对象。这和函数指针很像,遗憾的是,函数指针不原创 2016-06-07 11:43:49 · 1122 阅读 · 1 评论 -
STL 简单 copy 算法的实现
1.简介 不论是对客户端或对STL内部而言,copy() 都是一个常常被调用的函数。由于copy进行的是复制操作,而复制操作不外乎运用赋值运算符(assignment operator)或复制构造函数(copy constructor),但是某些元素的类型是trivial assignment operator,因此如果能使用内存直接进行复制(例如使用C标准函数memmove、原创 2016-06-06 19:36:54 · 2466 阅读 · 0 评论 -
STL 简单 <stl_algorithms.h> 算法的实现
1.简介STL标准中,没有区分基本算法和复杂算法,然而SGI STL却把常用的算法定义在中。本文介绍部分算法的实现,给出实现代码和测试代码。 本文介绍的算法包括:1. mismatch:比较两个序列,指出两者之间第一个不匹配的点,返回一对迭代器,分别指向两序列中不匹配的点;2. equal:如果两个序列在 [first, last ] 区间内相等原创 2016-06-05 20:18:30 · 1420 阅读 · 0 评论 -
STL 简单 <stl_numeric.h> 算法的实现
1.简介在STL中,算法可以大致分为两类:质变算法、非质变算法。质变算法会改变操作对象的值,非质变算法不会改变操作对象的值。所有的STL算法都作用在迭代器(iterator)所标识的区间上。 本文介绍的数值算法包括:1. accumulate:计算 [ first,last ) 内所有元素的总和;2. adjacent_difference:计算原创 2016-06-04 19:55:15 · 679 阅读 · 0 评论 -
STL 简单红黑树的实现
1.红黑树简介二叉搜索树能够提供对数的元素插入和访问。二叉搜索树的规则是:任何节点的键值一定大于其左子树的每一个节点值,并小于右子树的每一个节点值。常见的二叉搜索树有AVL-tree、RB-tree(红黑树)。红黑树具有极佳的增、删、查性能,故我们选择红黑树作为关联式容器(associative containers)的底层结构。红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或原创 2016-05-27 18:58:08 · 6928 阅读 · 1 评论 -
STL 简单 hashtable 的实现
1. 简介 Hash_table可提供对任何有名项(nameditem)的存取、删除和查询操作。由于操作对象是有名项,所以hash_table可被视为是一种字典结构(dictionary)。 Hash_table使用名为hashfaction的散列函数来定义有名项与存储地址之间的映射关系。使用hash faction会带来一个问题:不同的有名项可能被映射到相原创 2016-05-31 15:53:09 · 4127 阅读 · 0 评论 -
STL 简单 set 和 multiset 的实现
set的特性是所有元素都会根据键值自动排序,set的元素不像map那样同时拥有实值(value)和键值(key),set元素的键值就是实值,实值就是键值。Set不允许两个元素拥有相同的键值。不能通过迭代器修改set元素的值。 multiset和set的唯一区别在于multiset允许键值重复。 我们采用红黑树作为set和multiset的底层数据结构,set原创 2016-05-29 16:55:42 · 5068 阅读 · 0 评论 -
STL 简单 binary heap 的实现
我用VS2013写的程序(github ),queue版本的代码位于cghSTL/version/cghSTL-0.3.6.rar 所谓binary heap就是一种完全二叉树,也就是说,整颗binary tree除了对底层的叶节点外,是填满的,而最底层的叶节点由左至右不能有空隙。 完全二叉树内没有任何节点漏洞,这带来一个极大的好处:我们可以利用vector原创 2016-05-22 21:56:24 · 2689 阅读 · 0 评论 -
STL 简单 queue 的实现
我用VS2013写的程序(github ),queue版本的代码位于cghSTL/version/cghSTL-0.3.5.rar queue是一种先进先出(firstin first out)的数据结构。它有两个个出口,从底端加入元素,从顶端取得元素。但是除了最低端可以加入、最顶端可以删除以外,没有其他办法可以存取queue的元素,换言之,queue不允许遍历。queue原创 2016-05-21 21:20:40 · 2934 阅读 · 0 评论 -
STL 简单 stack 的实现
我用VS2013写的程序(传送门:github ),stack版本的代码位于cghSTL/version/cghSTL-0.3.4.rar stack是一种先进后出(firstin last out)的数据结构。它只有一个出口,除了栈顶以外,没有任何其他方式存取元素。stack没有遍历行为,故不需要迭代器,这让stack的设计变的非常简单,我们以deque作为缺省情况下的s原创 2016-05-21 20:25:13 · 915 阅读 · 0 评论 -
STL 简单 deque 的实现
我用VS2013写的程序(github ),list版本的代码位于cghSTL/version/cghSTL-0.3.3.rarVector是单向开口的连续线性空间,而Deque是双向开口的连续线性空间,可以在头尾两端插入和删除元素,而且deque没有容量(capacity)的概念,因为deque动态地以分段连续空间组合而成,随时可以增加一段新的空间并链接起来。 Deque原创 2016-05-20 21:33:12 · 4117 阅读 · 0 评论 -
STL 简单 list 的实现
相较于vector的连续线性空间,list就显得复杂许多,它的好处是每次插入或删除一个元素,就配置或释放一个元素空间。因此,list对于空间的运用有绝对的精准,一点不浪费。Vector的插入操作可能造成内存的重新配置,但是List不会。 List不再能够像vector一样以普通指针作为迭代器,因为其节点不保证在存储空间在连续存在。由于list是一个双向链表,迭代器必须具有前移、原创 2016-05-18 10:50:27 · 2217 阅读 · 0 评论 -
STL 简单 allocator 的实现
侯捷老师的书中介绍了空间配置器基本的接口(p43~44)。以下是一个简单的空间配置器实现:cghAlloc.h:#ifndef _CGH_ALLOC#define _CGH_ALLOC#include #include #include #include #include namespace CGH{ template inline T* _allocate(p原创 2016-05-06 09:57:03 · 2173 阅读 · 0 评论 -
STL 简单 iterator 的实现(含源码)
STL的中心思想在于将容器(container)和算法(algorithms)分开,彼此独立设计,最后再以一贴胶着剂将它们撮合在一起,而这个胶着剂就是迭代器(iterator)。 迭代器是访问容器的工具。注意,先有容器,才有访问容器的工具。迭代器需要了解容器的特性才能实现,这决定了迭代器必须要深入到容器内部,于是STL干脆把迭代器的开发交给容器的设计者。 迭原创 2016-05-10 10:04:57 · 2884 阅读 · 0 评论 -
STL 简单 vector 的实现
我是照着侯捷老师的《STL源码剖析》做的cghSTL,现在才看到第三章,忽然觉得这本书的编排非常适合自学。第一章讲解空间配置器,这是STL最基础的部件,没什么好说的。第二章讲解迭代器,老师举了单向链表的例子,这非常有考究,单向链表不需要连续的存储空间,意味着使用单向链表实现的容器不需要考虑空间溢出等问题,我们可以把注意力集中在容器的迭代器上。第三章讲解序列式容器,一来说怎么实现vect原创 2016-05-15 21:59:14 · 3327 阅读 · 0 评论