04 2012 档案

摘要:仿函数又叫函数对象,可以达到“将整组操作当做算法的参数”,定义于头文件<functional>STL仿函数应该具有配接的能力一般写法:template<class T>class A{ public: operator()(T x)const { //operations } private: //}调用方式A<int>()用class和struct都可以,注意class中必须要将重载()的函数写在public内STL不支持三元仿函数定义两个class,分别代表一元仿函数和二元仿函数template<class Arg, class Resul... 阅读全文
posted @ 2012-04-30 21:32 w0w0 阅读(213) 评论(0) 推荐(0)
摘要:lower_bound 二分查找的一个版本,在已排序区间中查找value如果区间中有该元素,则返回迭代器,指向第一个该元素如果没有改元素,则返回一个不小于value的元素返回值为:在不破坏排序的情况下,可插入value的位置__lower_bound(first, last, value, Dist... 阅读全文
posted @ 2012-04-30 18:46 w0w0 阅读(300) 评论(0) 推荐(0)
摘要:replace把区间内所有old_value替换成new_valuereplace(first, last, old_value, new_value){ for(; first!=last; ++first) { if(*first == old_value) *first = new_value; }}replace_if提供一个仿函数判断两个元素是否相等replace_copy把替换后的内容复制到目的容器中replace_copy(first, last, result, old_value, new_value){ for(;... 阅读全文
posted @ 2012-04-28 14:18 w0w0 阅读(207) 评论(0) 推荐(0)
摘要:寻找相等的相邻元素adjacent_find(first, last){ if(first == last) return last; ForwardIterator next = first; while(++next != last) { if(*next == *first) return first; first = next; } return last;}统计与value元素相等的元素的个数template <class InputIterator, class T>typename... 阅读全文
posted @ 2012-04-27 11:31 w0w0 阅读(216) 评论(0) 推荐(0)
摘要:STL中定义的set要求元素不得重复且已经排序set算法要求的都是有序区间,但元素可以重复出现另外提供的hash版本的set因为其元素无序,因此不能作为set函数的参数set算法前4个参数分别表示两个区间,第五个参数表示存放结果的区间的起始位置。还允许用户指定a<b的意义,判断两个元素是否相等全靠小于运算先给个例子#include<set>#include<iostream>#include<algorithm>#include<iterator>using namespace std;template <class T>str 阅读全文
posted @ 2012-04-27 09:32 w0w0 阅读(390) 评论(0) 推荐(0)
摘要:先给个实例:#include<iostream>#include<numeric>#include<vector>#include<algorithm>#include<functional>#include<iterator>#include<string>using namespace std;template <class T>struct display{ void operator()(const T& x) const { cout<<x<<" 阅读全文
posted @ 2012-04-26 12:48 w0w0 阅读(282) 评论(0) 推荐(0)
摘要:相关函数都包含在<numeric>中先列个实例#include<iostream>#include<numeric>#include<vector>#include<algorithm>#include<functional>#include<iterator>using namespace std;void main(){ int ia[5] = {1,2,3,4,5}; vector<int> iv(ia, ia+5); cout<<accumulate(iv.begin(), iv 阅读全文
posted @ 2012-04-26 08:55 w0w0 阅读(300) 评论(0) 推荐(0)
摘要:二叉搜索树具有对数时间的搜索复杂度,但是这样的复杂度是再输入数据有足够的随机性的假设上哈希表在插入删除搜索操作上也具有常数时间的表现,而且这种表现是以统计为基础,不需要依赖输入元素的随机性hashtable提供对任何有名项的存取操作和删除操作,可以视为一种字典结构,负载系数:元素个数除以表格大小,除非使用开链,负载系数永远在0,1之间碰撞的解决方法:线性探测:当hash function计算出某个元素的插入位置,而在该位置上的空间已经不可用时,循序往下寻找,如果到达尾端则绕到头部继续寻找,直到找到一个可用的空间为止。只要表格足够大,肯定能找到一个位置存放数据。进行元素搜索时,如果计算出来的位置 阅读全文
posted @ 2012-04-25 15:19 w0w0 阅读(661) 评论(0) 推荐(0)
摘要:STL源码剖析学习十:红黑树的实现RB-Tree的节点设计:节点设计分为两层:struct __rb_tree_node_base{ typedef __rb_tree_color_type color_type; typedef __rb_tree_node_base* base_ptr; color_typr color; base_ptr parent, left, right; static base_ptr minimun(base_ptr x) { while (x->left != 0) x = x->lef... 阅读全文
posted @ 2012-04-24 16:25 w0w0 阅读(724) 评论(0) 推荐(0)
摘要:STL源码剖析学习九:树二叉搜索树:可以提供对数时间的元素插入和访问。元素放置规则:任何节点的键值一定大于其坐子树的每个节点的键值,并且小于其右子树中的每一个节点的键值。插入新元素时,从根节点开始,遇到键值较大者就向左,遇到键值较小者就向右,一直到尾端。删除:如果A只有一个子节点,就直接将该子节点连接到A的父节点上。如果A有两个子节点,就用右子树内最小的节点取代A(右子结点向左走一直到底就是)。平衡二叉搜索树:没有一个节点过深,避免了因为树的大幅不平衡而导致的搜索时间延长的情况。AVL tree:加上了额外的平衡条件:任何节点的左右子树高度相差最多为1,保证对数深度的平衡条件。当插入元素时,只 阅读全文
posted @ 2012-04-23 16:32 w0w0 阅读(268) 评论(0) 推荐(0)
摘要:STL源码剖析学习八:heap & priority queueheap不是STL容器组件,但是作为priority queue的助手存在。完全二叉树:整棵树除了最底层的叶节点之外,都是填满的,而最底层的叶节点从左至右不能有空隙。好处是整棵树内没有任何节点漏洞,就可以用array表述整棵树(隐式表述法):将#0处保留,某个节点位于i处时,其左子节点必位于2i处,右子节点位于2i+1处,父节点位于2/i处。为了满足动态改变容量的要求,用vector代替array。push_heap:先将新加入节点插在最底层最右边的位置,vector的end处然后执行一个上溯的程序:把新节点与其父节点相比 阅读全文
posted @ 2012-04-22 12:57 w0w0 阅读(245) 评论(0) 推荐(0)
摘要:STL源码剖析学习七:stack和queuestack是一种先进后出的数据结构,只有一个出口。允许新增、删除、获取最顶端的元素,没有任何办法可以存取其他元素,不允许有遍历行为。缺省情况下用deque作为stack的底部结构,将其接口改变,封住一端就可以形成stack接口:empty()size()top()push()pop()operator==operator<由于stack以底部容器完成所有工作,成为adapter(配接器),不算做容器,叫做容器配接器stack不需要遍历,因此没有迭代器把list作为stack的底层容器stack<int,list<int>> 阅读全文
posted @ 2012-04-22 10:36 w0w0 阅读(214) 评论(0) 推荐(0)
摘要:deque是一种双向开口的连续性线性空间,可以在头尾都进行元素的插入和删除操作。是动态地以分段连续的空间组合而成,随时可以增加一段新的空间并连接起来。因此没有容量和空间保留的概念。提供随机访问迭代器,但不是以指针实现,复杂度很大。因此要多用vector少用deque对deque的排序操作,为了提高效率,可将deque先复制到vector中,排序后再拷回来。deque的中控器:从逻辑上看deque是连续空间,但是可以任意增长。有必要时在deque的前端或者尾端增加新的空间,便配置一段定量连续空间,串接在整个deque上。deque的最大任务就是维护其整体连续的假象,并提供随机访问接口。用一段ma 阅读全文
posted @ 2012-04-21 21:28 w0w0 阅读(238) 评论(0) 推荐(0)
摘要:每次插入或者删除一个元素,就配置或者释放空间。插入和删除元素操作都是常数时间。list的节点:template<class T>struct __list_node{ typedef void* void_pointer; void_pointer prev; void_pointer next; T data;}是一个双向链表list的迭代器:不能用普通指针作为迭代器typedef __list_node<T>* link_type;link_type node;list是一个双向链表,提供迭代器为双向迭代器,可向前向后移动,但不提供随机访问能力插入删除接合操作不会引 阅读全文
posted @ 2012-04-21 17:31 w0w0 阅读(194) 评论(0) 推荐(0)
摘要:vector和array的使用非常相似,区别是vector是动态空间,随着新元素的介入,靠内部机制就可以自动扩充空间以容纳新元素vector的迭代器:由于vector维护的是一个线性空间,所以可以用普通指针作为迭代器。指针也具备随即存取能力,因此vector提供随机访问迭代器。vector的数据结构:线性连续空间。用start和finish指向目前已经被使用的范围中的头尾,并且以迭代器end_of_storage指向整块连续空间(包括备用空间)的末尾。vector实际分配的空间一定大于等于需要的空间,以备将来的扩充。capacity的概念。vector的构造与管理:vector缺省使用allo 阅读全文
posted @ 2012-04-21 16:15 w0w0 阅读(200) 评论(0) 推荐(0)
摘要:STL的中心思想在于:将数据容器与算法分开,彼此独立设计,然后用胶合剂将他们撮合在一起。迭代器最重要的操作就是对operator*和operator->进行重载为了不暴露容器的内部实现细节,每一种容器都有专属的迭代器,这样就可以把所有的实现细节封装起来不被使用者看到。在迭代器的设计上使用泛型思想:当算法中需要声明一个变量,要用到迭代器所指向的对象的类别(value_type)==>使用参数推到机制万一需要把该类型用于函数的传回值==>声明一个内嵌类型,使用关键词typename但并不是所有的指针类型都是class,如果是原生指针就无法定义内嵌类型==>在泛化设计中提供一 阅读全文
posted @ 2012-04-21 14:24 w0w0 阅读(254) 评论(0) 推荐(0)
摘要:STL源码剖析学习二:空间配置器(allocator)标准接口:vlaue_typepointerconst_pointerreferenceconst_referencesize_typedifference_typerebindallocator()--default constructorallocator(const allocator<U>&--copy constructor~allocator()--destructoraddress(reference x)const--return address of elemaddress(const_referenc 阅读全文
posted @ 2012-04-21 13:24 w0w0 阅读(249) 评论(0) 推荐(0)
摘要:STL源码剖析学习一:概论STL所实现的,是依据泛型思维架设起来的一个概念结构。这个以抽象概为主体而非以实际类为主体的结构,形成一个严谨的接口标准。在此接口之下,任何组件都有最大的独立性,并以迭代器胶合起来,或者以配接器互相连接,或者用仿函数动态选择某种策略。六大组件:1.容器:各种数据结构2.算法3.迭代器:容器和算法之间的胶合剂 是“泛型指针”4.仿函数:行为类似函数,可以作为算法的某种策略5.配接器:修饰容器或者仿函数或者迭代器接口的东西6.配置器:负责空间配置和动态管理语法要点:1.静态常量可以在class内部直接初始化一般的变量都是不能在class内部直接初始化的,即使是常量也不行常 阅读全文
posted @ 2012-04-21 11:16 w0w0 阅读(162) 评论(0) 推荐(0)
摘要:刚学完《STL程序员开发指南》把算法中常用的函数列一下,备查把常用到的STL算法列下 备查非修正序列算法:对原序列不进行修改,功能是查找比较为主adjacent_find查找相同的相邻元素 反悔第一个元素的迭代器find查找元素 还有find系列查找函数find_first_offind_endfind_last_of....count统计相同元素的个数count_ifmismatch返回pair<第一个序列的迭代器,第二个序列的迭代器>表明第一处不相符合的位置equal比较容器中的元素是否相同for_each非常常用,遍历序列,并对序列中每个元素采用仿函数中定义的操作search 阅读全文
posted @ 2012-04-19 11:41 w0w0 阅读(267) 评论(0) 推荐(0)