STL源码剖析
文章平均质量分 87
水中鱼_自由
123
展开
-
Traits特性
在STL源码中,学会了一个重要的特性--traits编程特性,本人的理解如下:首先,由于使用函数模板推导机制只能推导出传给模板函数的参数类型,如果是通过函数返回值得类型,推导机制就不能推导出参数的类型,这就局限了迭代器的应用。而STL就想了一个办法,由于迭代器实际上就是一个class,迭代器就把其所需要的模板类型内嵌到自己的类中,这样,迭代器中的各个函数就可以使用这些模板类型。但是,对于原生指针,如原创 2016-02-24 15:24:16 · 280 阅读 · 0 评论 -
SGI 内存池
内存池:是解决内存碎片的主要方法,由于new和malloc是直接从操作系统那里通过其算法申请内存,每次申请操作系统都要执行一次,所以申请效率不仅不高,而且频繁的申请与释放内存会形成大量的内存碎片。而内存池的主要思想就是在初始化时就分配一大块内存给程序,当需要内存时,就从这一大块中切给程序,当释放时,也是释放到内存池中,并没有释放给操作系统。这样会大大的减少内存碎片,因为所有的内存操作都只在这个内存池原创 2016-04-09 11:00:25 · 622 阅读 · 0 评论 -
vector 和list
面试:为什么在字符串编程时用vector而不用list? vector和list的区别: vector适用:对象数量变化少,简单对象,随机访问元素频繁,它维护的是一个线性连续控件,所以普通指针就可以作为vector的迭代器。迭代器类型是随机迭代器 Random Acess Itrator.迭代器是普通指针。所以对于要随机存取的数据中的子数据来说,vector比list好用。 list适用:对象原创 2016-03-27 21:02:41 · 294 阅读 · 0 评论 -
迭代器类型
除了原生指针如int*等之外,迭代器总共有5种: Input Iterator:只读迭代器:这种迭代器所指的对象不允许外界改变,支持operator++; Output Iterator:只写迭代器:只能写,支持operator++; Forward Iterator:允许在其所形成的区间内进行读写操作,支持operator++; Bidirectional Iterator:双向迭代器:支原创 2016-03-27 21:12:09 · 388 阅读 · 0 评论 -
序列式容器
序列式容器先掌握有vector,list,deque.现在一一讲述。 vector:分配空间是一种线性空间,迭代器属于普通指针(即原生指针),由于是普通指针,所以是一种随机存取的迭代器。由于是线性空间,所以操作速度很快,虽然是可增长的,但在实际分配空间时,是按照定义所指定大小的2倍空间进行分配,如果后续增加的元素大于了此容量空间,那就需要按一下步骤进行操作: 1、重新找一块新的空间,是此容量的2原创 2016-03-13 16:36:02 · 453 阅读 · 0 评论 -
关联式容器
容器分为序列式容器和关联式容器,而关联式容器主体有set,map,hashtable为主,而mutiset,multimap,hash_set, hash_map,hash_multiset,hash_multimap都是其扩充。 set:其键值和实值都是同一个值,注意:set并没有什么机制,因为其底层是由RB-tree实现的,由于rb-tree的节点值不能有重复,所以set中的值在实现的时候就不原创 2016-03-14 22:49:09 · 373 阅读 · 0 评论 -
红黑树
红黑树是关联式容器的底层结构(set,map等),它是一颗二叉搜索树,即左子树的值小于该节点,右子树的值大于该节点,除此之外,满足一下规则: 1、每个节点不是红色就是黑色; 2、根节点为黑色; 3、若节点为红色,则其子节点必为黑色; 4、任一节点到叶子节点的任何路径,所含的黑节点数必须相同。 注意:并不一定要满足平衡二叉树的左右子树高度相差最多为1,因为其本身就由很好的平衡度。 对于新增原创 2016-03-13 22:24:27 · 243 阅读 · 0 评论 -
仿函数
定义:一种具有函数特质的对象。即仿函数实质上是一个模板类,它里面只有一类函数,即重载调用运算符().使之行为看起来类似函数。其实质是在调用时,产生一个临时对象,然后该对象去调用重载的调用运算符。 STL算法通常都可以接一个”操作”作为算法的参数,该”操作”有两种: 1.设计为一个函数,将函数指针当做算法的参数; 2.设计为一个仿函数,再以该仿函数产生一个对象,并以此对象作为算法的一个参数。原创 2016-07-24 12:03:07 · 415 阅读 · 0 评论