STL中有一个std::sort算法,但它是不支持std::list的,因为list不提供RandomIterator的支持,但list自己提供了sort算法,把list的元素按从小到大的方式来排序,代码长度到不长,但真是难以读懂,后来扣持了一下午终于搞明白了,贴个总结上来. list::sort的代码如下(sgi stl): [cpp] view plaincopy template <class _Tp, class _Alloc> void list<_Tp, _Alloc>…
最近在看 侯捷的 STL源码分析,发现了以下的这个list 排序算法,乍眼看去,实在难以看出它是归并排序. 平常大家写归并排序,通常写的是 递归版本..为了效率的考虑,STL库 给出了如下的 归并排序的迭代版本. 1. MergeSort 的递归版本 首先分析下 MergeSort 的递归版本是如何工作的.递归版本代码可参考 http://blog.csdn.net/shoulinjun/article/details/19290237 考虑如下的例子,对一个长度为 8 的数组进行归并排序. 2…
在 STL 源码中,到处可见 Traits 的身影,其实 Traits 不是一种语法,更确切地说是一种技术. STL库中,有一个函数叫做 advance, 用来将某个迭代器(具有指针行为的一种 class)移动 某个给定的距离.声明如下: template <typename IterT, typename DistT>  // 将迭代器向前移动 d 单位 void advance(IterT& iter,  DistT d);                  // 如果 d <…
两个连在一起的序列 [first, middle) 和 [middle, last) 都已经排序, 归并排序最核心的算法就是 将 [first, middle) 和 [middle, last) 在 O(N)时间内合并成一个有序数组. 但是合并的过程中一般需要  m + n 的额外辅助空间.其中, m . n 是数组的左右半边的长度. 现在假如, 1〉 辅助空间 bufSize < m + n 呢, 但是比 min(m, n) 大.也就是说能够容纳序列1 或者 序列 2. 2〉 bufSize…
声明:侯捷先生的STL源码剖析第二章个人感觉讲得蛮乱的,而且跟第三章有关,建议看完第三章再看第二章,网上有人上传了一篇读书笔记,觉得这个读书笔记的内容和编排还不错,我的这篇总结基本就延续了该读书笔记的框架,如果发现有雷同,请勿见怪,这篇文章只是我的个人记录,算不上原创,只是更多的想把概念描述清楚,所以如果您觉得有copy之嫌的话请绕道看您觉得的原链接.在第8部分给出了笔记的参考链接.   1.allocator 作用 STL的组件(容器)都需要配置空间以放置资料.这个就是allocator的作用…
Select 问题: 在一个无序的数组中 找到第 n 大的元素. 思路 1: 排序,O(NlgN) 思路 2: 利用快排的 RandomizedPartition(), 平均复杂度是 O(N) 思路 3:    同样是利用快排的 Partition(), 但是选择 pivot 的时候不是采用随机,而是通过一种特殊的方法.从而使复杂度最坏情况下是 O(N). 本文介绍 STL 算法库中 nth_elemnt 的实现代码. STL 采用的算法是: 当数组长度 <= 3时, 采用插入排序. 当长度 >…
allocator封装了stl标准程序库的内存管理系统,标准库的string,容器,算法和部分iostream都是通过allocator分配和释放内存的.标准库的组件有一个参数指定使用的allocator类,比如vector的原型是: template<typename _Tp, typename _Alloc = std::allocator<_Tp> > class vector : protected _Vector_base<_Tp, _Alloc> 第二个参数…
1. stl_list 介绍 今天我们来总结一下stl_List, 通过之前介绍单链表的文章,其实对链表的基本操作已经十分熟悉了,那对于stl_list,无非就是链表结构不一样,至于其中的增删改查的细节实现本质是一样的,都是处理指针偏移.相比于vector,stl_List在插入和删除的时候可以达到O(1)的时间复杂度. stl_list是一个双向循环链表,相对单链表来说查找效率高,无论是插入时的前插和后插,还是从后往前查找某个元素等.既然查找效率高了,自然添加,删除和修改元素时效率也就更高.唯…
1. allocator 基本介绍 分配器(allocator))是C ++标准库的一个组件, 主要用来处理所有给定容器(vector,list,map等)内存的分配和释放.C ++标准库提供了默认使用的通用分配器std::allocator,但是,也可以由程序员自己提供自定义分配器. 2. allocator 标准库规范 我们去看std中的stl分配器实现,会发现无论你的实现思路怎么变,所有模板类中的接口和成员变量都是一样的,那么这是因为C++标准库在制定分配器时,是有提出硬性标准的,具体接口…
前言 迭代器是将算法和容器两个独立的泛型进行调和的一个接口. 使我们不需要关系中间的转化是怎么样的就都能直接使用迭代器进行数据访问. 而迭代器最重要的就是对operator *和operator->进行重载, 使它表现的像一个指针. 类型 迭代器根据移动特性和实施操作被分为5类 input iterator(输入迭代器) : 迭代器所指的内容不能被修改, 只读且只能执行一次读操作. output iterator(输出迭代器) : 只写并且一次只能执行一次写操作. forward iterato…