STL源码分析
文章平均质量分 82
无名_1989
1、每天坚持读书1小时;2、坚持提升专业,成为单位专业权威;3、战胜两个坏毛病——拖延与抱怨;4、先从形象上改变,提升你的自信;5、时常反省自己,但不诋毁自己;6、向优秀的人学习;7、坚持早睡早起;8、坚持体育锻炼;9、保持微笑;10、帮助他人
展开
-
STL六大组件交互关系
Container通过Allocator取得数据存储空间,Algorithm通过Iterator存取Container内存,Functor可以协助Algorithm完成不同的策略变化,Adaptor可以修饰或套接Functor。...原创 2018-05-06 17:07:55 · 235 阅读 · 0 评论 -
STL之基础算法(一)
//查找区间[first,last)内第一次重复的相邻元素//若存在返回相邻元素的第一个元素位置//若不存在返回last位置/*该函数有两个版本:第一版本是默认操作operator==;第二版本是用户指定的二元操作pred函数对外接口的原型:equality (1):默认操作是operator== template <class ForwardIterator> Forw...转载 2018-04-25 10:33:28 · 100 阅读 · 0 评论 -
STL之set集合算法
/*下面是计算set集合的相关算法,分别是并集set_union,差集set_difference,交集set_intersection和对称差集set_symmetric_difference,这是个函数都提供了两个版本的函数原型第一个版本是采用默认的排序比较方式 operator<第二个版本是用户通过comp自行指定排序方式注意:这四个算法接受的输入区间都是有序的,输出也是有序...转载 2018-04-25 09:42:07 · 163 阅读 · 0 评论 -
STL之copy_backward函数
copy_backward与copy的调用结构基本一致,但也有稍许区别:例如1. copy有一个泛化版,两个特化版,而copy_backward只有一个泛化版;2. copy中的__copy有两个版本,分别用input_iterator_tag和random_access_iterator_tag区分,而copy_backward只有一个__copy_backward泛化版本;template ...转载 2018-04-25 07:38:35 · 558 阅读 · 0 评论 -
STL之copy函数
//唯一对外接口/*--------------------------------------------------------------------------------------* copy 函数及其重载形式*///完全泛化版本。 template<class InputIterator, class OutputIterator> // ? 这里的 Input...转载 2018-04-25 07:38:20 · 1434 阅读 · 0 评论 -
STL之mismatch
/*判断两个区间的第一个不匹配点,返回一个由两个迭代器组成的pair,其中第一个迭代器指向第一个区间的不匹配点,第二个迭代器指向第二个区间的不匹配点如果都匹配,返回的是指向两个区间的last迭代器。quality (1) :采用默认operator==比较 template <class InputIterator1, class InputIterator2> pair...转载 2018-04-24 09:49:47 · 289 阅读 · 0 评论 -
STL之lexicographical_compare
//--------------------------------------------------// lexicographical_compare and lexicographical_compare_3way.// (the latter is not part of the C++ standard.)/*功能:Returns true if the range [firs...转载 2018-04-24 09:44:06 · 211 阅读 · 0 评论 -
STL之iter_swap & swap
template <class ForwardIterator1, class ForwardIterator2, class T> inline void __iter_swap(ForwardIterator1 a, ForwardIterator2 b, T*) { T tmp = *a; ...转载 2018-04-24 09:31:59 · 333 阅读 · 0 评论 -
STL之fill和fill_n函数
template <class ForwardIterator, class T> void fill(ForwardIterator first, ForwardIterator last, const T &value) { for(; first != last; ++first) ...转载 2018-04-24 09:25:16 · 487 阅读 · 0 评论 -
STL之equal函数
template <class _InputIter1, class _InputIter2>//版本1inline bool equal(_InputIter1 __first1, _InputIter1 __last1, _InputIter2 __first2) { for ( ; __first1 != __last1; ++__fir...转载 2018-04-24 09:21:51 · 1164 阅读 · 0 评论 -
STL之基础算法(二)
/ generate and generate_n//将仿函数gen的处理结果填充在[first, last)区间内所有元素上,所谓填写//就是用迭代器所指元素的assignment操作//注意:对于用户自定义类型要提供operator =() template <class _ForwardIter, class _Generator>void generate(_For...转载 2018-04-25 11:11:33 · 104 阅读 · 0 评论 -
STL之unique_copy
template <class _InputIter, class _OutputIter, class _Tp>_OutputIter __unique_copy(_InputIter __first, _InputIter __last, _OutputIter __result, _Tp*) { _Tp __value =...转载 2018-05-03 09:19:45 · 152 阅读 · 0 评论 -
STL之基础算法(四)
template <class ForwardIterator1, class ForwardIterator2>inline ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ...转载 2018-04-27 12:25:16 · 143 阅读 · 0 评论 -
STL之rotate
STL对左旋转字符串针对三种不同数据结构进行了不同的实现。对单向链表采用的是同步位移,双向链表是三次翻转,都很简单,主要看看针对随机存取的数组做的循环位移实现。STL这个版本的源码如下:[cpp] view plain copytemplate <class RandomAccessIterator, class Distance> void __rotate(RandomAcces...转载 2018-04-26 10:45:46 · 474 阅读 · 0 评论 -
STL之基础算法(三)
// remove, remove_if, remove_copy, remove_copy_if//移除[first,last)区间内所有与value值相等的元素,并不是真正的从容器中删除这些元素(原容器的内容不会改变)//而是将结果复制到一个以result为起始位置的容器中。新容器可以与原容器重叠template <class _InputIter, class _OutputI...转载 2018-04-26 09:12:34 · 140 阅读 · 0 评论 -
STL之partial_sort
// partial_sort, partial_sort_copy, and auxiliary functions.//重新安排序列[first,last),使序列前半部分middle-first个最小元素以递增顺序排序,并将其置于[first,middle)//其余last-middle个元素不指定任何排序,并将其置于[middle,last)//注意:迭代器middle是在[firs...转载 2018-05-03 10:22:04 · 234 阅读 · 0 评论 -
STL之random_shuffle
// random_shuffle//将区间[first,last)内的元素随机重排//两个版本的不同是随机数的取得//版本一是使用内部随机数产生器//版本二是使用一个会产生随机数的仿函数/*函数功能:Rearranges the elements in the range [first,last) randomly.函数原型:generator by default (1) ...转载 2018-05-03 10:11:21 · 373 阅读 · 0 评论 -
STL之(next_)pre_permutation
// next_permutation and prev_permutation, with and without an explicitly // supplied comparison function.//next_permutation获取[first,last)区间所标示序列的下一个排列组合,若果没有下一个排序组合,则返回false;否则返回true;/*函数功能:Rearra...转载 2018-05-03 10:03:50 · 157 阅读 · 0 评论 -
STL之binary_search
//二分查找法//注意:[first,last)是已排序//同样也有两个版本/*函数功能:Returns true if any element in the range [first,last) is equivalent to val, and false otherwise.函数原型:default (1) :版本一默认operator< template <cla...转载 2018-05-03 09:45:11 · 233 阅读 · 0 评论 -
STL之lower_bound和upper_bound
// Binary search (lower_bound, upper_bound, equal_range, binary_search).template <class _ForwardIter, class _Tp, class _Distance>_ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter ...转载 2018-05-03 09:42:55 · 140 阅读 · 0 评论 -
STL greater<T>() 和less<T>()
greater() 和less()函数经常使用在sort()中用来对容器进行升序或者降序排序,或者用在push_heap()和pop_heap()中用来构建最小堆(greater)或者最大堆(less). 二者包含在头文件functional中//包含在头文件<functional>中 // TEMPLATE STRUCT greater emplate<class...转载 2018-04-24 09:17:04 · 499 阅读 · 0 评论 -
STL之hashtable(二)
/*hashtable节点结构,处于篇幅考虑,这里省去对应const类型code*/template <class Value, class Key, class HashFcn,class ExtractKey, class EqualKey,class Alloc>class hashtable {public: typedef Key key_type;//节点的键值...原创 2018-04-19 12:18:35 · 123 阅读 · 0 评论 -
STL之queue
queue是容器适配器,没有迭代器,queue的所有元素的进出都必须符合先进先出的条件,没有走访功能。STL中deque和list都可以作为queue的底层容器,缺省使用deque实现。#ifndef __STL_LIMITED_DEFAULT_TEMPLATEStemplate <class T, class Sequence = deque<T> >...原创 2018-04-11 09:57:16 · 88 阅读 · 0 评论 -
STL之stack
stack是以deque为底部容器,由于stack是以底部容器完成其所有工作,而具有这种性质者,称其为适配器,因此STL stack往往不被归类为容器,而被归类于container adapter。stack没有迭代器,stack只有顶端的元素才能被外界访问,所以,stack不提供走访功能。STL库中的vector,list,slist,deque都可以作为stack的底层容器。#i...原创 2018-04-11 09:46:39 · 119 阅读 · 0 评论 -
STL之deque(四)
void push_back(const value_type& t) { // 最后缓冲区尚有两个(含)以上的元素备用空间 if (finish.cur != finish.last - 1) { construct(finish.cur, t); // 直接在备用空间上构造元素 ++finish.cur; // 调整最后缓冲区的使用状态 ...原创 2018-04-10 09:22:28 · 202 阅读 · 0 评论 -
STL之deque源码
//stl_deque.h // 如果vector能满足你的需求, 那么就使用vector// 如果不得不使用deque, 那么在进行一算法(尤其是sort)操作时// 应该先把deque中的元素复制到vector中// 执行完算法再复制回去// 这样的效率往往要高于直接使用算法的效率#ifndef __SGI_STL_INTERNAL_DEQUE_H#define __SGI_S...转载 2018-04-15 09:02:10 · 123 阅读 · 0 评论 -
uninitialized_fill与fill的区别
uninitialized_fill与fill的区别在STL源码中可以经常看到uninitialized_fill与fill函数.刚开始不明白到底什么时候用uninitialized_fill还是fill函数.后来模仿写STL源码时,才明白了,这样做一个简单的说明希望对初学者有所帮助.先看看两个函数功能:1.fill是直接对每个元素进行填充value.2.uninitialized_fill(未初...转载 2018-04-14 21:21:02 · 1599 阅读 · 0 评论 -
STL之deque(三)
deque除了维护一个先前说过的指向map的指标外,也维护start,finish两个迭代器,分别指向第一个缓冲区的第一个元素和最后缓冲区的最后一个元素(的下一位置)。此外它当然也必须记住目前的map大小。因为一旦map所提供的节点不足,就必须重新配置更大的一块map。// deque的数据结构template <class T, class Alloc = alloc, si...原创 2018-04-09 09:26:25 · 157 阅读 · 0 评论 -
STL之deque(二)
下面是deque迭代器的几个关键行为。由于迭代器内对各种指标运算都做了重载化动作,所以各种指标运算如加,减,前进,后退...都不能直观视之。其中最重点的关键就是:一旦行进时遇到缓冲区边缘,要特别当心,视前进或后退而定,可能需要呼叫set_node()跳一下缓冲区。void set_node(map_pointer new_node){ node = new_node; first...原创 2018-04-08 12:22:04 · 127 阅读 · 0 评论 -
STL之deque(一)
概述: vector是单向开口的连续线性空间,deque则是一种双向开口的连续线性空间。所谓双向开口,意思是可以在头尾两端分别做元素的安插和删除动作。vector当然也可以在头尾两端做动作,但是其头部动作效率奇差,无法被接受。 deque和vector的最大差异,一在于deque允许在常数时间内对头尾端进行元素的安插或移除动作。二在于deque没有所有容量概念...原创 2018-04-08 09:53:54 · 150 阅读 · 0 评论 -
STL之priority_queue
priority_queue是一个拥有价值观的queue,它允许加入新元素,移除旧元素,审视新元素值等功能。由于这是一个queue,所以只允许在底部加入元素,并从顶端取出元素,除此之外另无其他存取元素的途径。 priority_queue带有价值观念,其内的元素并非按照被推入的次序排序,而是按照自动依照元素的权值排序。权值最高者,排在最前面。 缺省情况下pri...原创 2018-04-07 19:55:31 · 122 阅读 · 0 评论 -
STL之list(一)
list概述 相对于vector的连续性空间,list就显的复杂许多,它的好处是每次安插或删除一个元素,就配置或释放一个元素空间。因此,list对于空间的运用有绝对的精确,一点也不浪费。而且,对于任何职位的元素安插或元素移除,list永远是常数时间。 list和vector是两个最常使用的容器。什么时机下最合适使用哪一种容器,必须视元素的多寡,元素的构造复杂度...原创 2018-04-11 10:25:41 · 96 阅读 · 0 评论 -
STL之list(二)
// 默认allocator为alloc, 其具体使用版本请参照<stl_alloc.h>template <class T, class Alloc = alloc>class list{protected: typedef void* void_pointer; typedef __list_node<T> list_node; // ...转载 2018-04-11 11:18:02 · 94 阅读 · 0 评论 -
STL之hashtable
hashtable的桶子(buckets)与节点(nodes)。 hash table使用开链法完成hash table的图形表述。hash table表格内的元素为桶子(bucket),此名称的大约意义是,表格内的每个单元,涵盖的不只是节点,甚至可能是一“桶”节点。template<class Value>struct __hashtab...原创 2018-04-19 10:41:46 · 170 阅读 · 0 评论 -
STL之heap(一)
heap并不属于STL容器组件,它是个幕后英雄,扮演priority queue的助手。顾名思义,priority queue允许用户以任何次序将元素推入容器内,但取出来时一定是从优先权最高的元素开始取。 list可以作为priority queue的底层机制,元素插入操作可享常数时间。但是找到list的最大值,却需要对整个list进行线性扫描。可以改变做法,元素插入前先...原创 2018-04-07 08:30:11 · 184 阅读 · 0 评论 -
STL之slist(二)
template <class T, class Alloc = alloc>class slist{public: // 标记为'STL标准强制要求'的typedefs用于提供iterator_traits<I>支持 typedef T value_type; // STL标准强制要求 typedef va...转载 2018-04-13 09:57:44 · 141 阅读 · 0 评论 -
STL之slist(一)
STL list是双向串行。SGI STL另提供了一个单向串行,名为slist。这个容器并不在标准规格之内。 slist和list的主要差别在于,前者的迭代器属于单向的Forward Iterator,后者的迭代器属于双向的Bidirectional Iterator。此为,slist的功能自然也就受到许多限制。不过,单向串行所耗用的空间更小,某些动作更快,不失为另一...原创 2018-04-13 09:41:20 · 700 阅读 · 0 评论 -
STL之set,map,multiset,multimap
set,map和multiset,multimap的不同在于insert函数时调用底层红黑树不同的insert函数。/*插入节点:节点键值不允许重复,若重复则插入无效返回值是个pair,第一元素是个 rb_tree 迭代器,指向新增节点*/template <class Key, class Value, class KeyOfValue, class Compare, class Al...转载 2018-04-18 09:44:03 · 107 阅读 · 0 评论 -
STL之vector
#include<iostream>using namespace std;#include<memory.h> // alloc是SGI STL的空间配置器template <class T, class Alloc = alloc>class vector{public: // vector的嵌套类型定义,typedefs用于提供iter...转载 2018-04-12 10:36:17 · 96 阅读 · 0 评论 -
STL库list::sort()实现深度解析
原创,转载请注明出处:STL库list::sort()实现深度解析list模板的定义以及一些基本成员函数的实现这里我就不赘述了,还不清楚的同学可以到网上查找相关资料或者直接查看侯捷翻译的《STL源码剖析》相应章节。我之所以写这篇笔记是因为当时看到list::sort()源码时一时没看懂,后来在VS项目里一步步跟踪数据变化发现了其中的奥秘,被其简洁高效的非递归归并排序的实现方法所震撼(侯捷在《STL...转载 2018-04-12 09:39:25 · 196 阅读 · 0 评论