
STL源码解析
林夕水心
这个作者很懒,什么都没留下…
展开
-
智能指针源码总结
1.auto_ptrauto_ptr中就只有一个成员变量,就是一个模板指针,在构造函数的初始化列表中初始化这个成员变量,然后在析构函数中删除这个成员变量。但是不能有两个auto_ptr指针同时指向一块内存,这就是auto_ptr最大的缺陷。2.shared_ptrshared_ptr类中的继承关系如图所示①_Ref_count_base是计数器的基类,其中有两个计数器,一个_U...原创 2019-10-17 16:27:58 · 676 阅读 · 1 评论 -
STL第二章空间配置器的收货
一、placement newnew operator就是new操作符,不能被重载,假如A是一个类,那么A * a=new A;实际上执行如下3个过程。调用operator new分配内存,operator new (sizeof(A))调用构造函数生成类对象,A::A()返回相应指针事实上,分配内存这一操作就是由operator new(size_t)来完成的,如果类A重载了ope...原创 2019-10-21 16:17:26 · 216 阅读 · 0 评论 -
STL第三章迭代器收货
迭代器相应型别迭代器相应型别:value type 存储的是迭代器所指对象的类型difference type 一般为ptrdiff_t,这是系统定义的int类型数据类型pointer 一般是value type*reference 一般是value type&iterator catagoly 存储的是迭代器的类别因为定义了对应的结构体,所以称之为迭代器型别,个人理解就是...原创 2019-11-01 17:41:07 · 217 阅读 · 2 评论 -
STL vector容器
一、vector内部数据结构vector类中的成员变量如下: _Tp* _M_start; //目前使用的空间头部 _Tp* _M_finish; //目前使用的空间尾部 _Tp* _M_end_of_storage; //目前可用空间的尾部创建个vector数组,就是用空间配置器开辟块内存,这时_M_start指向这块空间的头部,_M_end_of_stor...原创 2019-10-22 14:08:25 · 234 阅读 · 1 评论 -
STL list容器
一、operator++()和operator++(int)这次认真看了一下list中的重载运算,发现了对operator++()和operator++(int)进行了重载,一时没有搞清楚这两者的区别,其实就是分别重载++前缀和++后缀,正好就以list中迭代器的的源码作为例子,分析一下++前缀和后缀有什么区别 _Self& operator++() { this->_...原创 2019-10-24 21:43:39 · 206 阅读 · 0 评论 -
STL deque容器
一、deque概述deque在使用层面上,可以看成是vector的进化版,因为vector在头部插入,其实是将所有元素后移,然后空出一个头部位置插入的。而deque则是直接在头部插入的。所以的确在使用层面可以看成是如下连续的结构。但是在源码层面,deque实现方法要比vector复杂很多,所以书上有这样一段话:注意:其实deque的sort也是使用STL的sort算法,只是deque在移...原创 2019-10-27 19:52:14 · 275 阅读 · 0 评论 -
STL stack和queue适配器
一、配接器和容器的区别适配器是以容器为底层接口封装的,比如stack和queue都是配接器,因为他们都是在deque或者list容器的基础上,进一步封装,形成自己的特性。而deque和list则是完全不依靠其他容器,自己独立实现的。二、stackstack特征:先进后出,并且只有一个出口,并且无法遍历数据结构中的元素。结构类似下图:stack默认是用deque实现的(也可以使用list...原创 2019-10-28 09:23:46 · 204 阅读 · 0 评论 -
STL heap
注意:heap并不是STL的容器或者配接器,但却是priority queue的底层实现。并且heap运用的是常用的最大堆以及堆排序的方法,所以值得一看一、最大堆和隐式表示法heap的数据结构是一个最大堆,最大堆就是一个完全二叉树,并且每个父节点都大于它的子节点(左右子节点的大小没有限制,不需要大的子节点一定要放哪边)隐式表示法就是一个二叉树,可以用一个数组来表示,如图所示任意一个节...原创 2019-10-28 14:41:14 · 288 阅读 · 0 评论 -
STL priority_queue配接器
一、priority_queue介绍priority_queue是一个拥有权值的queue,queue是先来的后出,而priority_queue是权值大的先出,具体可以查看如下的结构图:priority_queue的底层是依靠heap和vector实现的。二、源码展示...原创 2019-10-28 14:50:43 · 203 阅读 · 0 评论 -
STL RB tree
一、为什么需要红黑树对于一个有序数列,为了得到对数时间的插入和访问的速度,提出了二叉搜索树,这个树的规则就是任何节点的键值一定大于其左子树中每一个节点的键值,并小于右子树中每一个节点的键值。注意:要和最大堆区别开来,最大堆是父节点一定大于自己的子节点。相当于二叉搜索树是有从左往右变大的趋势,而最大堆则是有从下往上变大的趋势。但是二叉搜索树很有可能产生一种问题,就是不平衡。不平衡没有一个严格的...原创 2019-10-29 23:01:38 · 355 阅读 · 0 评论 -
STL set和map
这两个容器都是以红黑树为底层机制实现的,set中每个节点只有一个值,也就是把键值作为实值来用,而map中每个节点有两个值,把键值和实值分开一、set特点set底层就是红黑树机制,并且键值就是实值。所有set元素在插入时,就会按照实值(也是键值)自动被排序。,也就是红黑树中每个节点中_M_value_field变量存储的都是单一类型的值。set中不允许两个相同键值存在,因为set插入时使用的...原创 2019-10-30 19:24:23 · 288 阅读 · 0 评论 -
STL hashtable
SGI版本的STL中的哈希表以及hash_map和hash_set都没有被算入C++标准中的,所以在C++标准中的unorder_map和unorder_set才是最标准化的,其中底层使用的hashtable和我这篇文章中讲的hashtable区别不大,所以在文章的最后,我会对比一下SGI版本的哈希表和当下C++标准中的哈希表的区别一、哈希表概述哈希表同样是一个键值对应一个实值,但是哈希表找到...原创 2019-10-30 21:56:32 · 301 阅读 · 0 评论 -
STL sort函数
sort有两种重载形式,一种是依靠自定义的比较函数comp的排序函数,一种是依靠<运算符的排序函数。下面的源码解读选择<运算符的版本。sort函数的流程图如下1 提供给外界的接口sort源码template <class _RandomAccessIter>inline void sort(_RandomAccessIter __first, _RandomAcc...原创 2019-10-31 21:05:46 · 490 阅读 · 0 评论