随笔分类 -  STL源码剖析

摘要:准确来讲,heap并不属于STL容器,但它是其中一个容器priority queue必不可少的一部分。 阅读全文
posted @ 2019-11-07 20:09 羽园原华 阅读(401) 评论(0) 推荐(0)
摘要:Stack stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口,元素的新增、删除、最顶端访问都在该出口进行,没有其他位置和方法可以存取stack的元素。换言之,stack不允许有遍历行为。 在学习了deque之后,我们知道了deque是一个双向开口的结 阅读全文
posted @ 2019-11-03 16:36 羽园原华 阅读(163) 评论(0) 推荐(0)
摘要:Deque是一种双向开口的连续线性空间。 阅读全文
posted @ 2019-11-01 16:19 羽园原华 阅读(279) 评论(0) 推荐(0)
摘要:我们在学习序列式容器时,我们经常会遇到这三个函数:uninitialized_copy、uninitialized_fill、uninitialized_fill_n。在那时我们只是仅仅知道这些函数的功能,至于它们是如何实现的,我们并没有深究。在这节,我们花点时间摘下这几个函数的面具,看看它们不为人 阅读全文
posted @ 2019-10-29 13:05 羽园原华 阅读(209) 评论(0) 推荐(0)
摘要:list就是链表的实现,链表是什么,我就不再解释了。list的好处就是每次插入或删除一个元素,都是常数的时空复杂度。但遍历或访问就需要O(n)的时间。 List本身其实不难理解,难点在于某些功能函数的实现上,例如我们会在最后讨论的迁移函数splice()、反转函数reverse()、排序函数sort 阅读全文
posted @ 2019-10-26 16:35 羽园原华 阅读(202) 评论(0) 推荐(0)
摘要:本节要学的容器就是我们日常开发中使用最多的vector,vector的数据安排以及操作方式,与array非常相似。两者唯一的区别在于空间运用的灵活性。array是静态空间,配置了其大小就不能被改变,如果空间满了,要换大的,这只能自己手动来:配置新空间,将元素从旧址一一复制过去,再把原来的空间释放。而vector是动态空间,随着元素的加入,它内部会自行扩充空间,进行元素的复制并释放旧空间。所以在使用上,我们更趋向于使用vector而非array,因为不用考虑元素个数的问题,很适合动态元素个数的情况。我们不必因为害怕空间不足而一开始就要求一个大块头的array了。 阅读全文
posted @ 2019-10-25 11:05 羽园原华 阅读(273) 评论(0) 推荐(0)
摘要:上节给出了iterator_traits以及用到traits机制的部分函数的完整代码,可以看到traits机制能够提取迭代器的特性从而调用不同的函数,实现效率的最大化。显然这么好的机制不应该仅局限于在STL里面使用,在前某一节中我们也有说到,traits机制能够萃取类的特性,而这个类分为两个类别,一 阅读全文
posted @ 2019-10-21 20:04 羽园原华 阅读(411) 评论(0) 推荐(0)
摘要:在前两节介绍了迭代器的五个相应类型,并讲述如何利用traits机制提取迭代器的类型,但始终是把iteartor_traits类分割开来讨论,这影响我们的理解,本节将给出iteator的部分源码,里面涵盖了整个iteartor_traits泛化版本、偏特化版本以及一些算法的完整代码。重新把先前讲的知识 阅读全文
posted @ 2019-10-21 20:03 羽园原华 阅读(206) 评论(0) 推荐(0)
摘要:最后一个迭代器的相应类型就是iterator_category,就是迭代器本身的类型,根据移动特性与实行的操作,迭代器被分为了五类: Input Iterator:这种迭代器所指的对象,不允许外界改变。只读(read only)。 Output Iterator:唯写(write only) For 阅读全文
posted @ 2019-10-21 20:01 羽园原华 阅读(393) 评论(0) 推荐(0)
摘要:在算法中运用迭代器时,很可能用到其相应类型。什么是相应类型?迭代器所指对象的类型便是其中一个。我曾有一个错误的理解,那就是认为相应类型就是迭代器所指对象的类型,其实不然,相应类型是一个大的类别,迭代器所指对象的类型只是里面的其中一个。后面会讨论到相应类型的另外几种。 假设算法需要声明一个变量,以“迭 阅读全文
posted @ 2019-10-21 19:59 羽园原华 阅读(281) 评论(0) 推荐(0)
摘要:STL的中心思想在于:将数据容器与算法分开,独立设计,再用一帖粘着剂将它们撮合在一起。而扮演粘着剂这个角色的就是迭代器。容器和算法泛型化,从技术角度来看并不困难,C++的模板类和模板函数可分别达成目标,但如何设计出两者之间良好的粘着剂,才是大难题。 我们可以来尝试一下自己设计一个迭代器,看途中会遇到 阅读全文
posted @ 2019-10-21 19:56 羽园原华 阅读(259) 评论(0) 推荐(0)
摘要:上节在学习第二级配置器时了解了第二级配置器通过内存池与自由链表来处理小区块内存的申请。但只是对其概念进行点到为止的认识,并未深入探究。这节就来学习一下自由链表的填充和内存池的内存分配机制。 refill()函数——重新填充自由链表 前情提要,从上节第二级配置器的源码中可以看到,在空间配置函数allo 阅读全文
posted @ 2019-10-13 16:17 羽园原华 阅读(806) 评论(0) 推荐(0)
摘要:上节学习了内存配置后的对象构造行为和内存释放前的对象析构行为,在这一节来学习内存的配置与释放。 C++的内存配置基本操作是::operator new(),而释放基本操作是::operator delete()。这两个全局函数相当于C的malloc() 和free() 函数。而SGI正是以mallo 阅读全文
posted @ 2019-10-13 16:14 羽园原华 阅读(569) 评论(0) 推荐(0)
摘要:以STL的运用角度而言,空间配置器是最不需要介绍的东西,因为它扮演的是幕后的角色,隐藏在一切容器的背后默默工作。但以STL的实现角度而言,最应该首先介绍的就是空间配置器,因为这是这是容器展开一切运作的基石。空间配置器顾名思义就是配置空间的器件,为存放在容器里的信息找到安家落户的地方(内存)。 SGI 阅读全文
posted @ 2019-10-13 16:05 羽园原华 阅读(319) 评论(3) 推荐(0)