STL源码剖析
文章平均质量分 53
花花...
追自己的光
展开
-
STL源码剖析(二十四)适配器之仿函数
functor adaptersfunctor adapters是所有适配器中数量最庞大的族群,包括bind、negate、compose,以及一般函数或成员函数的修饰。通过绑定、组合、修饰能力,可无限制地创建出各种可能的表达式,搭配STL算法使用。例,找出某个序列中所有不小于12的元素个数,可使用内建仿函数greater_equal,也可not1(bind2nd(less(), 12)),将less()的第二参数绑定为12,再加上否定操作,便形成不小于12的语意。例,对序列中每个元素做特殊运算f原创 2021-11-06 16:39:26 · 173 阅读 · 0 评论 -
STL源码剖析(二十三)适配器之迭代器
适配器适配器在STL组件的中扮演转接器作用,事实上是一种设计模式,将一个class的接口转接为另一个class接口,使原本接口不能兼容的classes合作使用。改变仿函数接口称为function adapter,改变容器接口称为container adapter,改变迭代器接口称为iterator adapter。STL提供的queue和stack就是通过改变deque接口的适配器。前面文章已作介绍。insert iterators,reverse iterators,iostream iterat原创 2021-11-06 16:38:32 · 185 阅读 · 0 评论 -
STL源码剖析(二十二)仿函数
仿函数即函数对象,具有函数特质的对象。STL提供的算法,通常有两个版本,一个表现出最常用的某种运算,另一个则表现出最泛化的算法流程,允许用户以template参数来指定要采用的策略。允许用户指定任何操作,将某种操作当做算法的参数,先将该操作设计为一个函数,再将函数指针作为算法的一个参数,或将该操作设计为访函数,再以该函数产生一个对象,以此对象作为算法的参数。函数指针可满足将整组操作作为算法的参数,但不满足STL对抽象性的要求,也无法与STL其他组件如adapter搭配,产生更灵活的变化。仿函数是行原创 2021-11-06 16:37:18 · 177 阅读 · 0 评论 -
STL源码剖析(二十一)set、heap相关算法
set算法STL提供了四种set相关的算法,分别是并集union,交集intersection,差集difference,对称差集symmetric difference,与数学上的意义不一样。本节算法接受set/multiset容器作为输入区间,不接受hash_set/hash_multiset作为输入区间。输入及输出区间都是排序区间且元素不唯一,返回迭代器指向输出区间的尾端。set_unionset_union算法构造以S1为基础,S2与S1的并集,假设一个值在S1出现n次,在S2出现m次,那原创 2021-10-31 15:50:55 · 146 阅读 · 0 评论 -
STL源码剖析(二十)基本算法之copy
namespace std _GLIBCXX_VISIBILITY(default){ template<bool, bool, typename> //模板类__copy_move<bool, bool, typename> struct __copy_move { template<typename _II, typename _OI> static _OI //静态成员函数 __copy_m(_II __first, _II原创 2021-10-31 12:02:32 · 393 阅读 · 0 评论 -
STL源码剖析(十五)关联式容器之hashtable
hashtable前面介绍了二叉搜索树、平衡二叉搜索树、以及广泛使用的平衡二叉搜索树:红黑树。RB-tree红黑树不仅在树形的平衡在表现不错,在效率表现和实现复杂度上也保持相当的平衡,所以运用甚广。二叉搜索树具有对数平均时间的表现,但输入数据需具有足够的随机性;hashtable散列表在插入、删除、搜寻等操作上也具有常数平均时间表现,且这种表现是以统计为基础,不需要仰赖输入元素的随机性。hashtable散列表概述hash table可提供对任何有名项的存取操作和删除操作,因操作对象是有名项,所以原创 2021-10-11 19:02:56 · 166 阅读 · 0 评论 -
STL源码剖析(十六)关联式容器之hashtable设计
hashtable的桶子buckets与节点nodeshash table表格内的元素称为桶子,表格内的每个单元涵盖的不只是个节点,可能是一桶节点。bucket维护的linked list不是STL的list或forward_list,而是自行维护的hashtable node,至于bucket聚合体则以vector完成,以便有动态扩充的能力。hashtable的迭代器必须维系整个bucket vector的关系,并记录当前节点,++前进时如果当前节点在list尾端,则需要跳至下一个bucket。h原创 2021-10-11 12:41:39 · 175 阅读 · 0 评论 -
STL源码剖析(十四)关联式容器之set、map、multiset、multimap
set特性所有元素都会根据元素的键值自动被排序,set元素的键值就是实值,实值就是键值。set不可通过迭代器修改set元素值,set元素值就是其键值,关系到set元素的排列规则,源码中set::iterator被定义为底层RB-tree的const_iterator,杜绝写入操作。STL特别提供了一组set/mulset的相关算法,包括交集set_intersection、联集set_union、差集set_difference、对称差集set_symmetric_difference。set与li原创 2021-09-27 19:30:06 · 173 阅读 · 0 评论 -
STL源码剖析(十三)关联式容器之RB-tree(红黑树)设计
namespace std _GLIBCXX_VISIBILITY(default){_GLIBCXX_BEGIN_NAMESPACE_VERSION#if __cplusplus > 201103L# define __cpp_lib_generic_associative_lookup 201304#endif // Red-black tree class, designed for use in implementing STL // associative contai原创 2021-06-08 16:54:18 · 427 阅读 · 0 评论 -
STL源码剖析(十二)关联式容器之树、红黑树
根据数据在容器中的排列,容器分为序列式容器和关联式容器。标准的STL关联式容器分为set(集合)和map(映射表)两大类,以及衍生体multiset、multimap等。这些容器的底层机制均以RB-tree(红黑树)完成。RB-tree也是一个独立容器,但不开放在外界使用。待补充。...原创 2021-06-08 15:56:57 · 213 阅读 · 0 评论 -
STL源码剖析(十一)序列式容器之forward_list
namespace std _GLIBCXX_VISIBILITY(default){ struct _Fwd_list_node_base { _Fwd_list_node_base() = default; _Fwd_list_node_base(_Fwd_list_node_base&& __x) noexcept : _M_next(__x._M_next) { __x._M_next = nullptr; } _Fwd_lis原创 2021-06-08 15:44:46 · 237 阅读 · 0 评论 -
STL源码剖析(十)序列式容器之heap、priority_queue
heap算法原创 2021-05-17 15:46:18 · 227 阅读 · 0 评论 -
STL源码剖析(九)序列式容器之stack、queue
stack、queue原创 2021-05-17 15:43:37 · 138 阅读 · 0 评论 -
STL源码剖析(十九)基本算法<stl_algobase.h>
namespace std _GLIBCXX_VISIBILITY(default){ template<typename _ForwardIterator1, typename _ForwardIterator2> inline void iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b) { // concept requirements __glibcxx_function_r原创 2021-04-19 19:39:09 · 322 阅读 · 0 评论 -
STL源码剖析(十八)数值算法<stl_numeric.h>
namespace std _GLIBCXX_VISIBILITY(default){ template<typename _ForwardIterator, typename _Tp> void iota(_ForwardIterator __first, _ForwardIterator __last, _Tp __value) { // concept requirements __glibcxx_function_requires(_原创 2021-04-16 14:09:35 · 211 阅读 · 0 评论 -
STL源码剖析(十七)算法
算法概观以有限的步骤,解决逻辑或数学上的问题,称为算法。以下所探讨的是记录于STL中,极具复用价值的STL算法。算法分析和复杂度表示O()一般而言,算法的执行时间和所要处理的数据量有关,两者之间存在某种函数关系,一次、二次、三次或对数关系,分别表示为O(N), O(N2), O(N3) , O(logN),数据量小时,多项式函数每项内容都可能对结果产生影响,数据大时,只有最高次方的项目才具主导地位。STL算法总览算法名称 算法用途原创 2021-04-16 09:32:18 · 144 阅读 · 0 评论 -
STL源码剖析(二)__alloc_traits特性
__alloc_traits特性类__allocator_traits_base,用于获取内存分配器Alloc的属性,内存分配器不一定是std::allocator,可以是自定义的。namespace std _GLIBCXX_VISIBILITY(default){ struct __allocator_traits_base { //分配器_Tp没有rebind成员函数时,调用普通版本__rebind template<typename _Tp, typename _原创 2021-03-18 20:03:56 · 1586 阅读 · 0 评论 -
STL源码剖析(三)__type_traits特性
__type_traits特性在下一篇文章中将讲解Traits编程技法运用于STL实现中,它利用内嵌类型的编程技巧与编绎器的template参数推导功能,增加C++未能提供的关于类型认证方面的能力。iterator_traits负责提供迭代器的特性,__type_traits负责提取类型的特性,关注的类型特性为:类型是否具备non-trivial default ctor,是否具备non-trivial copy ctor,是否具备non-trivial assignment operator,是否具备原创 2021-03-18 14:41:19 · 283 阅读 · 0 评论 -
STL源码剖析(八)序列式容器之deque设计
deque原创 2021-03-11 09:32:40 · 185 阅读 · 0 评论 -
STL源码剖析(七)序列式容器之deque迭代器设计
deque概述vector是单向开口的连续线性空间,deque是双向开口的连续线性空间。双向开口,意思是可以在头尾两端分别做元素的插入和删除操作。deque允许常数时间内对头尾两端进行元素的插入或删除,且deque没有容量capacity的概念,因为它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并链接起来,因此不需要提供所谓的空间保留功能。deque提供Ramdom Access Iterator,但迭代器不是普通指针,更复杂,当然会影响各个运算层面,因此,除非必要,应尽可能选择使用ve原创 2021-03-11 09:32:03 · 298 阅读 · 0 评论 -
STL源码剖析(六)序列式容器之list
list概述list对于任何位置元素的插入或移除,永远是常数时间。list本身和节点是不同的结构,需要分开设计。list在存储空间不是连续存在的,迭代器必须指向list的节点,并能进行正确的递增、递减、取值、成员存取等操作。STL list是一个双向链表,提供的是Bidirectional Iterators。list的插入和删除操作不会导致所有迭代器失效。SGI list不仅是一个双向链表,还是一个环状双向链表,只需要一个指针,但可完整表现整个链表。环状链表只需一个标记,即可完全表示整个链表原创 2021-03-09 14:38:52 · 239 阅读 · 1 评论 -
STL源码剖析(五)序列式容器之vector
namespace std _GLIBCXX_VISIBILITY(default){_GLIBCXX_BEGIN_NAMESPACE_VERSION_GLIBCXX_BEGIN_NAMESPACE_CONTAINER /// See bits/stl_deque.h's _Deque_base for an explanation. template<typename _Tp, typename _Alloc> struct _Vector_base {原创 2021-03-08 10:40:33 · 372 阅读 · 0 评论 -
STL源码剖析(四)迭代器iterators设计与traits特性
iterator_traits设计如下:iterator_traits必须针对传入类型为pointer及pointer-to-const都,设计特例化版本。namespace std _GLIBCXX_VISIBILITY(default){_GLIBCXX_BEGIN_NAMESPACE_VERSION /** * @defgroup iterators Iterators * Abstractions for uniform iterating through variou原创 2021-03-02 16:26:57 · 277 阅读 · 0 评论 -
STL源码剖析(一)allocator内存分配类
空间配置器allocator1,空间配置器隐藏在容器背后工作,STL的操作对象存放在容器内,而容器需要配置一定的空间。2,空间不一定是内存,可以是磁盘或其他辅助存储介质,但一般情况下allocator配置对象为内存。allocator模板类定义如下:namespace std _GLIBCXX_VISIBILITY(default){_GLIBCXX_BEGIN_NAMESPACE_VERSION /// allocator<void> specialization. //原创 2021-02-22 21:58:34 · 496 阅读 · 0 评论 -
STL源码剖析
template<typename _Tp, typename _Alloc = std::allocator<_Tp> > class vector : protected _Vector_base<_Tp, _Alloc> {#ifdef _GLIBCXX_CONCEPT_CHECKS // Concept requirements. typedef typename _Alloc::value_type _Alloc_..原创 2021-02-09 15:27:56 · 542 阅读 · 0 评论