
STL源码剖析
STL源码的详细剖析,包括STL里的类型技术、内存管理、算法、数据结构、STL各类组件的高阶实现技术。主要参考侯捷的《STL源码剖析》和SGI STL文档
zhsenl
这个作者很懒,什么都没留下…
展开
-
STL源码剖析 容器 stl_hashtable.h
hashtable---------------------------------------------------------------------------二叉搜索树具有对数平均时间的表现,它建立在输入数据有足够的随机性的假设hashtable 有常数平均时间的表现,基于统计,不需依赖输入元素的随机性hashtalbe 的简单实现:所有元素都 16-bits 不带正负号的整数,范围 0~65535,配置一个 array,索引号码为 0~65535,初值全部为 0 。每一个元素原创 2014-07-23 09:27:44 · 1337 阅读 · 0 评论 -
STL源码剖析 容器 stl_map.h
map--------------------------------------------------------------------------------所有元素都会根据元素的键值自动被排序。map的所有元素都是 pair,同时拥有实值和键值。不可以修改元素的键值,因为它关系到 map 元素的排列规则可以修改元素的实值,因为它不影响 map 的排列规则map iterator 既不是一种 constant iterators , 也不是一种 mutable iterator标准原创 2014-07-22 16:50:59 · 1317 阅读 · 0 评论 -
STL源码剖析 算法 set
set相关算法------------------------------------------------------------------------------------描述:set_union , set_difference , set_intersection , set_symmetric_difference 算法接受的 set ,必须是有序区间,适用于以 RB-tree 为底层的 set/multiset , 不适用于以 hash 为底层的 hash_set/hash_mul原创 2014-07-22 16:49:39 · 1099 阅读 · 0 评论 -
STL源码剖析 容器 stl_set.h
set------------------------------------------------------------------------所有元素都会根据元素的键值自动被排序。不可以通过 set 的迭代器改变 set 的元素值。因为 set 元素值就是其键值,关系到 set 元素的排列规则。set<T>::iterator 被定义为底层 RB-tree 的 const_iterator,杜绝写入操作标准的 STL set 以 RB-tree 为底层机制,就像 stack 以 dequ原创 2014-07-22 16:44:30 · 1026 阅读 · 0 评论 -
STL源码剖析 容器 stl_tree.h
RB-tree(红黑树)--------------------------------------------------------------------------平衡二叉搜索树 --> 平衡可提高搜索效率常见的平衡二叉搜索树有:AVL-tree(任何节点的左右子树高度相差最多 1)、红黑树、AA-treeAVL-tree 破坏平衡的情况及恢复平衡的方法恢复时要先找到失去平衡的点外侧插入 --> 单旋转内侧插入 --> 双旋转 图5-10图5-11图5-12红黑树是原创 2014-07-22 16:45:58 · 1312 阅读 · 0 评论 -
STL源码剖析 容器 stl_queue.h
queue----------------------------------------------------------------------stack 是一种配接器(adapter),以某种容器作为底部结构,改变其接口,使之符合"先进先出"的特性。SGI STL 默认以 deque 为 stack 底部结构没有遍历行为,没有遍历器示例:#include <queue>#include <list>#include <iostream>#include <algorithm>原创 2014-07-21 10:05:48 · 1071 阅读 · 0 评论 -
STL源码剖析 容器 stl_stack.h
stack-------------------------------------------------------------stack 是一种配接器(adapter),以某种容器作为底部结构,改变其接口,使之符合"先进后出"的特性。SGI STL 默认以 deque 为 stack 底部结构没有遍历行为,没有遍历器示例:#include <stack>#include <list>#include <iostream>#include <algorithm>using names原创 2014-07-21 10:03:24 · 943 阅读 · 0 评论 -
STL源码剖析 容器 stl_deque.h
deque------------------------------------------------------------------------??一直看不懂 operator->() ,不明白它为什么不用接受参数,直接 return &(operator*())好像我们用迭代器的时候也不没怎么用到这个函数,甚至我都不会用1.概述vector 是单向开口的连续线性空间,deque 则是一种双向开口的连续线性空间允许常数时间内对起头端进行元素的插入和移除操作没有容量概念,因为它是动原创 2014-07-21 09:59:23 · 1190 阅读 · 0 评论 -
STL 源码剖析 算法 stl_heap.h
heap-------------------------------------------------------------------------binary heap 是一种完全二叉树。隐式表示法:以 array 表述 tree。小技巧:将 array 的 #0 元素保留,则第 i 个元素的左右子节点分别是 2i 和 2i + 1,父节点是i/2 --> STL 里没有采用这种小技巧将 array 无法动态改变大小,所以用 vector 替代 array这个文件里提供了各种堆操作的原创 2014-07-21 09:58:35 · 1033 阅读 · 0 评论 -
STL源码剖析 容器 stl_list.h
list----------------------------------------------------------------------??为什么很多在算法库里有的算法还要在类的成员函数里重新实现一遍?-->1.因为算法库里的是通用的,对于具体的类来说效率不高。比如说 reverse 如果直接用 stl_algo.h 里的 reverse,会再调用 iter_swap,而 iter_swap 的实现方法是借用临时变量来交换两个迭代器指向的元素,这样会调用好几次构造函数、拷贝方法、析构原创 2014-07-21 09:57:31 · 1394 阅读 · 0 评论 -
STL源码剖析 容器 stl_vector.h
vector----------------------------------------------------------------------描述:1.迭代器vector 维护的是一个连续线性空间,它的迭代器是普通指针,能满足 RandomAccessIterator 所有必要条件:operator*, operator->,operator++,operator--,operator+,operator-,operator+=,operator-=,operator[]2.数据原创 2014-07-20 18:35:42 · 1329 阅读 · 0 评论 -
STL 源码剖析 算法 stl_algo.h -- merge sort
merge sort----------------------------------------------------------------------描述:归并排序思路:1.将区间对半分割2.对左、右段分别排序3.利用inplace_merge将左、右段合并成为一个完整的有序序列复杂度:O(log n)源码:template<class BidirectionalIter>void mergesort(BidirectionalIter first, Bidirecti原创 2014-07-20 18:31:07 · 1215 阅读 · 0 评论 -
STL 源码剖析 算法 stl_algo.h -- inplace_merge
inplace_merge(应用于有序区间)--------------------------------------------------------------------描述:如果两个连接在一起的序列[first, middle)和 [middle, last]都已排序,那么 inplace_merge 可将它们结合成单一一个序列,并仍有序。源码:template <class BidirectionalIterator>inline void inplace_merge(Bidi原创 2014-07-20 18:28:40 · 1131 阅读 · 0 评论 -
STL 源码剖析 算法 stl_algo.h -- nth_element
nth_element------------------------------------------------------------------------------描述:重新排序,使得[nth,last)内没有任何一个元素小于[first,nth)内的元素,但对于[first,nth)和[nth,last)两个子区间内的元素次序则无任何保证。思路:1.以 median-of-3-partition 将整个序列分割为更小的左、右子序列2.如果 nth 迭代器落于左序列,就再对左子原创 2014-07-20 18:25:49 · 1156 阅读 · 0 评论 -
STL 源码剖析 算法 stl_algo.h -- equal_range
equal_range(应用于有序区间)--------------------------------------------------------------------------------------------------------------------------------------描述:利用二分查找找到一个区间,区间里的所有值都等于给定值,返回的是一个pair,分别存储区间的上界迭代器和下界迭代器源码:template <class ForwardIterator, c原创 2014-07-20 18:23:31 · 1037 阅读 · 0 评论 -
STL 源码剖析 算法 stl_algo.h -- partial_sort / partial_sort_copy
partial_sort / partial_sort_copy-----------------------------------------------------------------------------------------------------------------------------------------描述:本算法接受一个 middle 迭代器(位于序列[first, last) 之列),然后重新安排[first, last),使序列中的 middle - firs原创 2014-07-20 18:14:25 · 1239 阅读 · 0 评论 -
STL 源码剖析 算法 stl_algo.h -- random_shuffle
random_shuffle--------------------------------------------------------------------------------------------------------------------------------------------------------------------------描述:将[first,last)的元素次序随机重排。思路:必须是 RandomAccessIterator 1.遍历区间2.产生[原创 2014-07-20 18:06:59 · 1477 阅读 · 0 评论 -
STL 源码剖析 算法 stl_algo.h -- pre_permutation
pre_permutation----------------------------------------------------------------描述: 取得 [first, last) 所标示之序列的前一个排列组合。如果没有,返回 false,有,返回true思路:从后往前1.找两个相邻元素,令左端的元素为*i,右端的元素为*ii,且满足 *i > *ii2.找出第一个小于 *i 的元素,令其为 *j,将*i,*j元素对调3.将ii右端的所有元素颠倒template <cl原创 2014-07-20 18:00:45 · 1055 阅读 · 0 评论 -
STL 源码剖析 算法 stl_algo.h -- next_permutation
next_permutation-----------------------------------------------------------------------描述: 取得 [first, last) 所标示之序列的下一个排列组合。如果没有,返回 false,有,返回true思路:从后往前1.找两个相邻元素,令左端的元素为*i,右端的元素为*ii,且满足 *i < *ii2.找出第一个大于 *i 的元素,令其为 *j,将*i,*j元素对调3.将ii右端的所有元素颠倒源码:t原创 2014-07-19 19:46:17 · 862 阅读 · 0 评论 -
STL 源码剖析 算法 stl_algo.h -- binary_search
int main(){ int A[] = { 1, 2, 3, 3, 3, 5, 8 }; const int N = sizeof(A) / sizeof(int); for (int i = 1; i <= 10; ++i) { cout << "Searching for " << i << ": " << (binary_search(A, A + N, i) ? "present" : "not present") << endl; }}/*原创 2014-07-19 19:44:20 · 924 阅读 · 0 评论 -
STL 源码剖析 算法 stl_algo.h -- upper_bound
upper_bound(应用于有序区间)-------------------------------------------------------------------------------------------------------------------------------------------------描述:受STL区间前闭后开习惯的影响,upper_bound成功找到某个值时,返回一个迭代器指向每一个"不大于 value "的元素的下一个位置,而不是指向 value 的迭代原创 2014-07-19 19:43:27 · 892 阅读 · 0 评论 -
STL 源码剖析 算法 stl_algo.h -- lower_bound
lower_bound(应用于有序区间)--------------------------------------------------------------------------------------------------------------------------描述:二分查找,返回一个迭代器指向每一个"不小于 value "的元素,或 value 应该存在的位置思路:1.循环直到区间长度为 0 2.如果 *middle < value,在后半段继续查找3.如果 *mid原创 2014-07-19 19:42:05 · 1208 阅读 · 0 评论 -
STL 源码剖析 算法 stl_algo.h -- search_n
search_n ----------------------------------------------------------------------------------------描述:在序列[first, last) 所涵盖的区间中,查找"连续 count 个符合条件之元素"所形成的子序列,并返回迭代器 last 思路:1.首先找出 value 第一次出现点2.该出现点的后面是否连续出现 count - 1 个 value3.如果是,找到了,如果不是,在当前元素后的区间重新找原创 2014-07-19 19:40:46 · 880 阅读 · 0 评论 -
STL 源码剖析 算法 stl_algo.h -- rotate
rotate--------------------------------------------------------------描述:将[first, middle) 内的元素和[middle, last) 内的元素互换。图6-6g/*------------------------------------------------------------*分派函数(dispatch function)*/template <class ForwardIterator>inline原创 2014-07-18 16:36:05 · 951 阅读 · 0 评论 -
STL 源码剖析 算法 stl_algo.h -- search
search-------------------------------------------------------------------------描述:在序列一[first1, last1) 所涵盖的区间中,查找序列二[first2, last2) 的首次出现点。思路:1.遍历序列二2.如果两序列的当前元素一样,都前进 13.否则序列二的迭代器重新指向开始元素,序列一前进 1 ,序列一的长度减 1复杂度:最坏情况是平方: 最多 (last1 - first1) * (last2原创 2014-07-18 16:34:54 · 920 阅读 · 0 评论 -
STL 源码剖析 算法 stl_algo.h -- includes
includes(应用于有序区间)-------------------------------------------------------------描述:S1和S2都必须是有序集合,判断序列二 S2 是否"涵盖于"序列一 S1,即"S2的每一个元素是否都出现于 S1中"思路:1.遍历两个区间,直到其中一个走完2.如果序列二的元素小于序列一的元素,则在序列一中不可能有元素等于序列二的当前元素了,直接返回 false3.如果序列一的元素小于序列二的元素,则序列一前进 14.如果两序列元原创 2014-07-18 16:33:43 · 871 阅读 · 0 评论 -
STL 源码剖析 算法 stl_algo.h -- partition
partition------------------------------------------------------------------------描述:partition 会将区间[first,last) 中的元素重新排列。所有被一元条件运算 pred 判定为 true 的元素,都会被放在区间的前段,被判定为 false 的元素,都会被放在区间的后段。partition 不稳定,不保证 partition 后元素保留在原始相对位置, stable_partition 稳定思路:原创 2014-07-18 16:29:31 · 947 阅读 · 0 评论 -
STL 源码剖析 算法 stl_algo.h -- merge
merge (应用于有序区间)--------------------------------------------------------------------------描述:将两个经过排序的集合S1和S2,合并起来置于另一段空间。所得结果也是一个有序(sorted)序列思路:1.遍历两个序列直到其中一个结束了2.如果序列一的元素较小,将它放到结果序列中,并前进 13.如果序列二的元素较小,将它放到结果序列中,前前进 14.遍历结束后,将还没有遍历完的序列复制到结果序列的尾部源码:原创 2014-07-18 16:29:20 · 745 阅读 · 0 评论 -
STL 源码剖析 算法 stl_algobase.h
1.iter_swap描述:将两个 ForwardIterator 所指的对象对调源码://version 1template <class ForwardIterator1, class ForwardIterator2, class T>inline void __iter_swap(ForwardIterator1 a, ForwardIterator2 b, T*) { T tmp = *a; *a = *b; *b = tmp;}//version 2template原创 2014-07-16 17:33:50 · 922 阅读 · 0 评论 -
STL 源码剖析 算法 stl_numeric.h -- copy
唯一对外接口/*--------------------------------------------------------------------------------------* copy 函数及其重载形式*///完全泛化版本。 template<class InputIterator, class OutputIterator> // ? 这里的 InputIterator 和 OutputIterator 都只是名称而已,哪里确保了它们真的至少是 InputIterator 和 O原创 2014-07-16 17:27:30 · 1162 阅读 · 0 评论 -
STL 源码剖析 算法 stl_numeric.h
描述、源码、示例version 1:普通操作版本version 2: 泛化操作版本1.accumulate描述:计算 init 和 [first, last) 内所有元素的总和源码://version 1template <class InputIterator, class T>T accumulate(InputIterator first, InputIterator last, T init) { for ( ; first != last; ++first) ini原创 2014-07-16 17:26:11 · 1255 阅读 · 1 评论