上一页 1 ··· 5 6 7 8 9 10 11 12 13 ··· 28 下一页
摘要: 配接器:一种设计模式将一个class的接口转换成另一个class的接口,使原来因为接口不兼容而不能合作的class可以一起运作容器配接器queue 和 stack 修士deque的接口成了另一种容器迭代器配接器Insert Iterator: 将一般的赋值操作变成插入操作,包括back_inserter_iterator,front_insert_iterator,insert_iteratorSTL提供三个相应的函数back_inserter(container& x), front_inserter(container& x),inserter(container& 阅读全文
posted @ 2012-05-01 13:25 w0w0 阅读(382) 评论(0) 推荐(0) 编辑
摘要: 仿函数又叫函数对象,可以达到“将整组操作当做算法的参数”,定义于头文件<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 阅读(208) 评论(0) 推荐(0) 编辑
摘要: lower_bound 二分查找的一个版本,在已排序区间中查找value如果区间中有该元素,则返回迭代器,指向第一个该元素如果没有改元素,则返回一个不小于value的元素返回值为:在不破坏排序的情况下,可插入value的位置__lower_bound(first, last, value, Dist... 阅读全文
posted @ 2012-04-30 18:46 w0w0 阅读(294) 评论(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 阅读(196) 评论(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 阅读(205) 评论(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 阅读(382) 评论(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 阅读(277) 评论(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 阅读(293) 评论(0) 推荐(0) 编辑
摘要: 二叉搜索树具有对数时间的搜索复杂度,但是这样的复杂度是再输入数据有足够的随机性的假设上哈希表在插入删除搜索操作上也具有常数时间的表现,而且这种表现是以统计为基础,不需要依赖输入元素的随机性hashtable提供对任何有名项的存取操作和删除操作,可以视为一种字典结构,负载系数:元素个数除以表格大小,除非使用开链,负载系数永远在0,1之间碰撞的解决方法:线性探测:当hash function计算出某个元素的插入位置,而在该位置上的空间已经不可用时,循序往下寻找,如果到达尾端则绕到头部继续寻找,直到找到一个可用的空间为止。只要表格足够大,肯定能找到一个位置存放数据。进行元素搜索时,如果计算出来的位置 阅读全文
posted @ 2012-04-25 15:19 w0w0 阅读(651) 评论(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 阅读(711) 评论(0) 推荐(0) 编辑
摘要: STL源码剖析学习九:树二叉搜索树:可以提供对数时间的元素插入和访问。元素放置规则:任何节点的键值一定大于其坐子树的每个节点的键值,并且小于其右子树中的每一个节点的键值。插入新元素时,从根节点开始,遇到键值较大者就向左,遇到键值较小者就向右,一直到尾端。删除:如果A只有一个子节点,就直接将该子节点连接到A的父节点上。如果A有两个子节点,就用右子树内最小的节点取代A(右子结点向左走一直到底就是)。平衡二叉搜索树:没有一个节点过深,避免了因为树的大幅不平衡而导致的搜索时间延长的情况。AVL tree:加上了额外的平衡条件:任何节点的左右子树高度相差最多为1,保证对数深度的平衡条件。当插入元素时,只 阅读全文
posted @ 2012-04-23 16:32 w0w0 阅读(261) 评论(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 阅读(238) 评论(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 阅读(204) 评论(0) 推荐(0) 编辑
摘要: deque是一种双向开口的连续性线性空间,可以在头尾都进行元素的插入和删除操作。是动态地以分段连续的空间组合而成,随时可以增加一段新的空间并连接起来。因此没有容量和空间保留的概念。提供随机访问迭代器,但不是以指针实现,复杂度很大。因此要多用vector少用deque对deque的排序操作,为了提高效率,可将deque先复制到vector中,排序后再拷回来。deque的中控器:从逻辑上看deque是连续空间,但是可以任意增长。有必要时在deque的前端或者尾端增加新的空间,便配置一段定量连续空间,串接在整个deque上。deque的最大任务就是维护其整体连续的假象,并提供随机访问接口。用一段ma 阅读全文
posted @ 2012-04-21 21:28 w0w0 阅读(226) 评论(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 阅读(187) 评论(0) 推荐(0) 编辑
上一页 1 ··· 5 6 7 8 9 10 11 12 13 ··· 28 下一页