
STL源码学习
文章平均质量分 68
Virtual_Func
小风扇吹风好吵
展开
-
针对不同类型迭代器实现各自的高效函数重载
1.不同的迭代器类型对相同功能的函数需进行不同的处理1.Input Iterator :只读迭代器,不允许外界改变所指对象2.Output Iterator:只写迭代器3.Forward Iterator:单向迭代器,只允许单向移动4.Bidirectional Iterator:双向迭代器5.Random Access Iterator:随机访问迭代器(p+n,p-n)原创 2015-09-12 22:24:23 · 789 阅读 · 0 评论 -
AVL树的思想与C++实现
AVL树(Adelsin-Velskii-Landis Tree)是平衡二叉搜索树的一种,它要求任何节点的左右子树的高度相差最多为1。现在将总结AVL树的基本操作。1.关于树的节点的一些常用术语的定义a.路径长度(length):根节点至任意节点之间有唯一路径,该路径所经过的边数即为路径长度b.深度(depth):根节点至任意节点的路径长度即为该节点的深度c.高度(heig原创 2015-10-04 17:10:47 · 742 阅读 · 0 评论 -
犯过的C++错误: vector::swap()函数
在知乎上看到一个问题,问一下代码为什么错://...vector x;//....x.swap(vector(x)); //错误出现的地方我的错误解答是:因为 vector(x) 产生了一个临时对象,将该临时对象与 X 进行 swap 操作,交换了对方的三个指针(first,end,finish),指向分配的内存空间,然后再该语句结束后,临时对象被释放掉,所以此时 x原创 2015-11-01 16:51:08 · 6579 阅读 · 0 评论 -
STL 中 lower_bound 与 upper_bound 与 二分查找
首先,先说明 lower_bound 与 upper_bound 的含义。对于区间 [first,last) 内的元素:1.lower_bound :寻找最远的 i,使得 [ first, i ) 中的每个迭代器 j 都满足 *j 2.upper_bound:寻找最远的 i,使得 [ first, i ) 中的每个迭代器 j 都不满足 *j > value示例:序列: 1,原创 2015-11-01 12:07:18 · 832 阅读 · 0 评论 -
关于序列旋转(辗转相除求取最大公约数)
看STL看到 rotate ,关于序列旋转学习到很多东西,先说一下旋转,旋转的意思如下:输入:1 2 34 5 6 7,翻转点为 4输出:4 5 6 71 2 3即要求将序列从D开始反转。在《编程珠玑》中说过关于 [ A B ] 转到 [ B A ] 的情况,采用的方法类似翻手掌的方法,方法如下:1.先将 A ,B 分别逆序。得到: 3 2 17 6 5 42.再将原创 2015-10-30 18:44:28 · 842 阅读 · 0 评论 -
STL中 copy 的结构图
本来要详细写 copy的实现的,但是最近没空,就先放上之前画的结构图,有空再补原创 2015-11-14 11:19:38 · 444 阅读 · 0 评论 -
STL的算法中,一些很简练的算法——持续更新
1.在序列1中寻找序列2第一次出现的位置在序列1中寻找序列2第一次出现的位置在 SGI_STL 中采用了以第一个序列中的每一个元素作为标志的方法向后匹配,直到匹配到第二个序列完整出现。假设第一个序列的长度为n,第二个序列的长度为m,在最坏的情况下,该算法的复杂度为 O((n-m)*m)。该算法的亮点在于写得特别简介明了。具体代码如下:template InputIterator1 __s原创 2015-10-28 10:20:53 · 390 阅读 · 0 评论 -
SGI 计算幂次方的精简计算方法
通常,我们需要计算 X 的 n 次方的最简单的计算方法如下:int power(int x,int n){ int result = 1; while(n--) { result *= x; } return result;}上述程序的时间复杂度为 O(n),即需要计算 n 次方,则需要执行 n 次循环。但 SGI 的 STL 中使用了一种巧妙的方法将进入循环的次数降到原创 2015-10-25 16:19:32 · 2496 阅读 · 0 评论 -
仿函数存在的原因
我们知道仿函数是仅重载了括号操作符,且定义了若干相应型别的类。仿函数存在的意义,是为了能提取出仿函数中定义的相应型别,使仿函数能与函数适配器进行配接,而这些相应型别则主要是用来表现函数参数类型与传回值类型。函数指针因为没有相应型别而不能与STL 中别的组件进行搭配。因此,仿函数的相应型别是一个很重要的因子。STL 中定义了两个类,分别代表一元仿函数和二元仿函数,其中没有任何数据成员或函数成原创 2015-11-08 23:21:31 · 1099 阅读 · 0 评论 -
vector的clear()操作与内存
首先,很明确的给定:vector 的 clear() 操作是不会释放内存的!!!!!!!!!下面说说 vector 的 stl 源码里,clear()函数在做什么。以下是cygnus C++ 2.91.57 for windows 版本的 STL 中的部分源码: void clear() { erase(begin(), end()); } 可以看出,vector 的clea原创 2015-09-17 11:32:16 · 3386 阅读 · 0 评论 -
红黑树的思想
红黑树也是平衡二叉搜索树的一种,红黑树可能产生不平衡状态(高度相差1以上),但是红黑树的搜索效率与AVL树基本相等。1.红黑树性质:红黑树必须满足以下四个规则:a)每个节点不是红色就是黑色b)根节点必须是黑色c)如果节点为红色,其子节点必须为黑色d)任何一个节点至NULL的任何路径,所含的黑节点树必须相同*为了方便通常使Null节点为黑2.插原创 2015-10-04 19:22:50 · 545 阅读 · 0 评论 -
SGI_sort,sort
文章转自:http://www.cnblogs.com/imAkaka/articles/2407877.htmlSTL的sort()算法,数据量大时采用Quick Sort,分段递归排序,一旦分段后的数据量小于某个门槛,为避免Quick Sort的递归调用带来过大的额外负荷,就改用Insertion Sort。如果递归层次过深,还会改用Heap Sort。本文先分别介绍这个三个S转载 2015-11-03 11:37:55 · 486 阅读 · 0 评论 -
关于模板类中模板成员函数在类定义外部特化报错,错为声明与定义不匹配
今天写STL中 rb_tree 的时候意外的发现一个问题:模板类的模板成员函数不能在类定义外部进行特化,特化必须放在类定义内,否则将报错:error C2244: “X::test”: 无法将函数定义与现有的声明匹配经过写如下的简单代码可以看出问题所在:(错误版本)//定义模板类X。其中拥有模板成员 testtemplate class X{public: X(){}原创 2015-10-17 11:45:11 · 4320 阅读 · 0 评论 -
iterator_traits 存在的作用与意义
1.关于迭代器有关类型的获取与iterator_traits:有时候可能我们会需要知道迭代器的某些具体有关类型,如:迭代器所指对象的类型,两个迭代器之间距离的类型,迭代器解引用操作结果的类型,迭代器->操作结果的类型,以及迭代器本身的类型(单向,双向等)。因此,不同容器的迭代器都必须支持对上述迭代器有关类型的查询反馈,STL则采用内嵌类型声明的方式来实现对上述类型的返回。其中:value_原创 2015-09-12 21:34:01 · 3532 阅读 · 0 评论 -
STL 中iterator_traits
STL中,设计适当的相应类型是迭代器的责任。而设计适当的迭代器则是容器的责任。迭代器的相应类型有以下几种:1.value_type迭代器所指对象的类型2.difference_type迭代器的差值的类型3.reference_type迭代器的*操作的类型4.pointer_type迭代器的->操作的类型5.iterator_type迭代器原创 2015-09-12 20:14:56 · 624 阅读 · 0 评论 -
使用swap来释放vector的内存
先说明如何使用swap来释放 vector 的内存,然后再说明在释放过程中发生了什么。释放操作如下:void func(){ vector vec(2,3); vec.swap(vector()); //该swap操作将释放原本 vector 所占用的内存 }我们知道,vector 是使用三个指针 start,finish,end_of_storage 来对 vector 所占用原创 2015-09-18 09:46:38 · 2674 阅读 · 4 评论