c++标准库STL体系结构与内核分析
文章平均质量分 61
Mirevas
这个作者很懒,什么都没留下…
展开
-
C++标准库STL体系结构与内核分析
总结泛型编程,就是以模板为主要工具来编写程序STL是范型编程最成功的作品,以下是根据STL探讨泛型编程目标使用C++标准库认识C++标准库(深入认识C++标准库,非常清楚部件在内存中的实现)良好使用C++标准库(熟悉标准库的体系结构)扩充C++标准库标准库一个C++编译器会提供很多头文件,以文件而不是编译好的东西,可以看到源代码,这就是c++标准库c++标准库包括STL以及一些其它的小组件一、STL体系结构与基础介绍STL六大部件简介、容器的遍历对应1原创 2021-10-20 14:42:03 · 161 阅读 · 0 评论 -
(十六)一个万用的hashfunction
customer是元素,要将它放到容器中为它写hash function,左边是成员函数版本,右边是非成员函数版本左边的形式,传入模板参数时传入的是类的名称。创建对象时,函数对象会被自动创建调用。右边的形式,传入的第二个参数是函数的类型。在创建真正的对象时还要传入函数的地址。都是在第四步修改seed,最终返回seed版本三:为模板写一个特化版本版本三的示例...原创 2021-10-07 18:26:14 · 120 阅读 · 0 评论 -
(十五)适配器adapters
适配器简介adapter更像是一个换肤工程,如把参数的个数改一下或者把函数的名称改一下。适配器根据它所改的对象分为三类函数适配器迭代器适配器容器适配器适配器更像是一个桥梁,只是修改接口,并不自己实现真正的功能适配器都是用内含的方式实现对另一个东西的控制容器适配器stack、queue二者都内含了一个sequence,默认是deque。将容器的所有接口封装为个别的几个,或者将容器的接口封装后修改其名称template <class T, class Sequence =原创 2021-10-07 17:52:55 · 93 阅读 · 0 评论 -
(十四)仿函数functors
仿函数简介functor是最有可能自定义融入到标准库中,辅助实现一些功能仿函数只为算法服务仿函数的语法functors必需重载小括号仿函数就是一个重载了小括号的类,这样的一个类所创建出来的对象就是函数对象,因为这个对象像一个函数。标准库中的仿函数分为三类算术类逻辑运算类相对关系类(比大小)template<class T>struct plus : public binary_function为什么需要仿函数,而不是直接使用运算符原创 2021-10-06 19:46:28 · 99 阅读 · 0 评论 -
(十三)STL部分算法简介
c++标准库提供的算法qsort不是c++标准库的算法,它们是c的函数qsort(c.data(), ASIZE, sizeof(long), compareLongs);long *pItem = (long*)bsearch(&target, (c.data()), ASIZE, sizeof(long), compareLongs);c++标准库算法一定是在std中,且前几个参数一定都是迭代器,要使用这种方式访问容器数据算法accumulateaccumulate是累原创 2021-10-06 19:10:52 · 100 阅读 · 0 评论 -
(十二)迭代器的分类
标准库算法从语言层面来看容器Container是class template算法Alogorithm是function template迭代器Iterator是class template仿函数Functor是class template适配器Adapter是class template分配器Allocator是class template算法看不到迭代器,它所需要的一切信息都必需从Iterstor取得,而迭代器必需能够回答算法的所有问题,才能搭配算法的所有操作//同一个算法可能原创 2021-10-03 22:45:00 · 730 阅读 · 0 评论 -
(十一)hashtable
hashtable有N个元素,这些元素要放到容器中,且每个元素都可以转化为一个数值。这些元素的个数变化范围是0~2的32次方-1,需要至少2的32次方个元素的大小由于不可能准备这么大的空间,且元素的个数也不一定到2的32次方。对每个元素编号,采用取余法确定元素要放置的地点,如果容器长度为H,元素的编号为M,则将它放置到M%H处如果当前位置已经有元素了,则发生了冲突,将它跟在当前元素的后面(采用链表)如果一个节点的链表太长,就要将该链表打散重排。经验法则是,当元素个数大于篮子的个数,就要将链表打散。原创 2021-10-03 11:54:45 · 97 阅读 · 0 评论 -
(十)红黑树、set、map
红黑树红黑树是高度平衡的二叉搜索树。它的排列规则有利于serach和insert,并保持深度平衡即没有任何一个节点太深。红黑树提供遍历操作及迭代器,遍历得到一个有序序列(中序遍历)不应该使用迭代器修改红黑树节点的值,对于map,可以修改value,对于set,不能更改,防止破坏红黑树的有序性。红黑树提供两种插入操作,一种是insert_unique()另一种是insert_equal()。前者表示节点的key在整棵树中是独一无二的,后者允许节点的key重复,且相同key一定是相邻的。// Ke原创 2021-10-02 23:37:42 · 216 阅读 · 0 评论 -
(九)deque深度剖析、queue、stack
deque的实现deque是双向开口的一段空间,实质上是分段连续的具体实现如下图,先分段,再将它们串接起来。底层是一个vector,存放指向每一个缓冲区的指针,缓冲区的次序与vector的次序相同。最后一个缓冲区已经被元素填满,再分配一个缓冲区,把它串接到底层的vector中,就可继续向后扩充。如果向前扩充的缓冲区也被填满,再分配一个缓冲区,vector中靠近左端元素的空位置存储新分配缓冲区的指针。当控制中心满了后,会扩容为原来的二倍,类似vector的动态增长。deque的迭代器是一个class原创 2021-10-02 14:34:16 · 101 阅读 · 0 评论 -
(八)array、forward_list的实现
arrayarray本身是c语言中已经存在的数组,为什么还要包装成容器array被包装成一个容器,要遵循容器的规则,要提供iterator且迭代器要提供五种相应的类型,以便于让算法获得必要的信息,方便算法采取最优化的操作如果没有包装,array就被排斥在标准库六大部件之外,无法直接与算法、仿函数等等交互arrayTR1版TR1是介于c++98和c++11之间的一种版本array没有构造函数与析构函数template<typename _Tp, std::size_t _Nm原创 2021-10-01 13:37:26 · 106 阅读 · 0 评论 -
(七)vector深度剖析
容器vector的实现vector是一种动态增长的数组,在数组用完的时候,它会自动扩充。没有任何一种东西在内存中可以原地扩充,在当前数组用完后,它会在内存的另一个地方,重新开辟一个当前数组容量二倍大小的数组,将当前的元素全部移过去2.9版vector中有三个指针,start指向vector的起始位置,finish指向vector的最后一个元素,end_of_storage指向容器的最后一个空槽位的下一个位置。template <class T, class Alloc = alloc&原创 2021-10-01 13:12:38 · 226 阅读 · 0 评论 -
(六)iterator简介、迭代器萃取器、偏特化的应用
Iterator需要遵循的原则迭代器是容器与算法之间的桥梁,算法的最基本特性是它要求其迭代器提供哪些操作算法问迭代器问题,如iterator_catgory是什么,以便于采取最佳的操作方式。iterator必需提供的5种assocaited types,后面这两种从来都没有被使用过iterator_category迭代器的分类输入迭代器:只读,不写;单遍扫描,只能递增输出迭代器:只写,不读;单遍扫描,只能递增前向迭代器:可读写;多遍扫描,只能递增双向迭代器:可读写;多遍扫描,可递增递减原创 2021-09-29 23:37:53 · 142 阅读 · 0 评论 -
(五)List深度剖析
容器list的实现本质是一个环状的双向链表GNU C++ 2.9版链表大小是4,是一个指向链表节点类型的指针节点有三个变量,分别是指向前驱节点的指针,指向后继节点的指针,储存数据所有的容器,除了vector和array,它的迭代器都必须是class,它才能成为一个智能指针。为了接口的一致,它必然要typedef为iterator.所有的迭代器类都分为两部分,一部分是typedef,另一部分是操作符重载操作符重载可以看成是向偶像致敬,它的偶像就是整数。最好的类的设计是将类的使用像整数一原创 2021-09-29 22:09:32 · 135 阅读 · 0 评论 -
(四) 分配器allocator
分配器一般不建议直接使用分配器,它给容器分配内存,分配器的效率高低会直接影响容器的效率,包括速度和空间所有的分配动作,最终都会调用malloc(),这个函数再根据当前所处的操作系统不同,调用不同的操作系统API,拿到真正的内存mallocoperator new()和delete底层都调用malloc()malloc分配如下图,蓝色的内存,再搭配一整包东西返回附加的额外空间基本是固定的,如果所需的内存大,额外开销就小,如果所需的内存小,额外开销就大加的东西详细见内存管理all原创 2021-09-29 16:22:30 · 178 阅读 · 0 评论 -
(三)面向对象编程与泛型编程比较
OOP面向对象要有class与class,以及之间的继承关系、虚函数面向对象编程企图将datas与methods绑在一起GP泛型编程是将datas和methods分开来标准库中用容器存储数据,用算法处理数据算法的操作通过迭代器确定操作范围,访问容器中的元素优点容器和算法的开发团队可以独立开发,只要双方之间将接口规定好所有的算法,其最终涉及元素本身的操作,无非就是比大小bool strLong(const string& s1, const string&a原创 2021-09-29 13:07:34 · 566 阅读 · 0 评论 -
(二)顺序容器、关联容器的简介
容器的结构与分类容器可分为两类顺序容器关联式容器顺序容器有五个,是按照放入容器的顺序排列的Array数组,容量固定的连续空间Vector,后面是可以扩充的顺序容器,它的自动增长由分配器处理内存实现Deque双端队列,两端可进可出,前后均可以扩充List双向链表,节点之间通过前后指针连接Forward-List单向链表关联容器,适用于有大量查找动作的场合,底层实现是红黑树Set,key就是value,放入的元素不能重复Multiset,key就是value,放入的原创 2021-09-28 23:06:18 · 218 阅读 · 0 评论 -
(一)STL六大部件简介、容器的遍历
STL六大部件容器Containers分配器Allocators算法Algorithms迭代器Iterators适配器Adapters仿函式Functors六个组件之间的关系最常使用的是容器,容器要放东西,东西要占内存容器的使用不需要考虑内存设计,它背后有分配器支持容器容器里面放了东西要进行操作,除了容器本身的一些操作外,还有许多的模板函数,就是算法用算法处理容器的数据要访问元素,实现这个桥梁的就是迭代器,相当于一种泛化的指针仿函数的作用像是一种函数,实现自定义类对象之间的原创 2021-09-28 15:05:38 · 122 阅读 · 0 评论