STL源码分析--算法

STL源码剖析—算法

         在STL中的算法中一些算法是可以根据算法名字来判断算法作用的。所有算法的参数都是迭代器,不过不同的算法调用的迭代器类型也是不同的。多有的STL算法都作用在由迭代器{first,lase)所表示出来的区间上。拷贝(copy)交换(swap)替换(replace)填写(fill)删除(remove)排列组合(permutation)分割(partition)随机重排(random shuffling)排序(sort)计算(accumulate)计数(count)匹配(search)查找(find)比较(equal mismatch)寻找极值。而且在有的函数中需要一些仿函数。

         所有泛型算法的前两个参数都是一对迭代器,采用前闭后开形式。不过有的函数中不仅仅有两个参数,可能还有一个迭代器,还有一个接收仿函数的参数。

        

         Next_permutation,求下面的一个排列,对于有序区间来说,实现的方法如下:

         从最尾端开始往前寻找两个相邻元素,领第一元素为*I,第二元素为*II,且满足*i< *ii.找到这样一组相邻元素后,再从尾端开始往前检验,找出第一个大于*i的元素,令为*j,将I,j元素对调,再将ii之后的元素颠倒排列(当然包括ii)。此即所求之“下一个”排列数组。

         这里所说的第一个元素和第二个元素分别代表*i和*ii.*i始终在*ii左边。

 

         Partial_sort排序,本算法接受一个middle迭代器(位于序列[first,last)之内),然后重新安排[first,last),使序列中的middle-first个最新元素以递增顺序排序,置于[first,middle)内,其余last-middle个元素安置于[middle,last)中,不保证有任何特定顺序。

 

         Sort算法接受两个randomaccessiterators(随机存取迭代器),然后将区间内的所有元素以渐增方式由小到大重新排列。第二个版本则允许用户指定一个仿函数,作为排序标准。STL的所有关系型容器都拥有自动排序动能(底层结构采用RB-tree)。所以不需要这个sort算法。至于序列式容器中的stack、queue和priority-queue都有特定的出入口,不允许用户对元素排序。剩下vector、deque和list,前两者的迭代器属于Randromaccessiterator,适合使用sort算法,list的迭代器则属于forwarditerators,都不适合使用sort算法。如果要对List或slist排序,应该使用它们自己提供的sort()函数。

 

         Nth_element,这个算法会重新排列[first,last)。使迭代器nth所指的元素,与“整个[first,last)完整排序后,同一个位置的元素”同值。此处并宝恒[nth,last)内没有任何一个元素小于[first,last)内的元素,但对于[first,nth)和[nth,last)两个子区间的元素次序则无任何保证—这一个点也是它与partial_sort很大的不同处。

         什么意思呢?比如一个向量存储整数,首先这个函数可以接受三个迭代器,使得以第二个迭代器所指的元素作为关键词,将整个区间分段同时使得第二个迭代器指向的原始元素在整个区间中的位置正好是第二个迭代器的位置。

         举例说明:

         {20,30,30,17,33,40,17,23,22,12,20},以下操作:

Nth_element(iv.begin(), Iv.begin()+5,iv.end());

便是将小于 *(iv.begin()+5)(本例为40)的元素置于该元素之左,其余置于该元素之右,并且不保证维持原有的相对位置。获得的结果为{20,12,22,17,17,22,23,30,30,33,40}。执行完毕后第五个元素位置上的元素值为22,与整个序列完整排序后{12,17,17,20,22,22,23,30,30,33,40}的第五个位置上的元素值相同。

         如果以上述结果{20,12,22,17,17,22,23,30,30,33,40}为根据,在执行以下操作:

Nth_element(iv.begin(), Iv.begin()+5,iv.end());

那便是将大于*(iv.beng()+5)(本例为22)的元素置于该元素之左,其余置于该元素之右,并且不保证维持原有的相对位置,获得的结果为{40,33,30,30,23,22,17,17,22,12,20}。

 


对于lower_bound和upper_bound:

也由于查找的区间并不对称([irst,last)包含first但不包含last),所以upper_bound与Lower_bound的返回值意义大有不同。如果你查找某值而它的确出现在ranges之中,lower_bound返回的是指向该元素的iterator。相比较之下upper_bound并不这么做。因为upper_bound所返回的是在不破坏顺序的情况下value可被安插的最后一个合适位置。如果value存在,那么它返回的iterator将指向value的下一个位置。而非value自身。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容简介回到顶部↑这本书不适合C++ 初学者,不适合 Genericity(泛型技术)初学者,或 STL 初学者。这本书也不适合带领你学习面向对象(Object Oriented)技术 — 是的,STL 与面向对象没有太多关连。本书前言清楚说明了书籍的定位和合适的读者,以及各类基础读物。如果你的Generic Programming/STL实力足以阅读本书所呈现的源码,那么,恭喜,你踏上了基度山岛,这儿有一座大宝库等着你。源码之前了无秘密,你将看到vector的实现、list的实现、heap的实现、deque的实现、RB-tree的实现、hash-table的实现、set/map 的实现;你将看到各种算法排序、搜寻、排列组合、数据移动与复制…)的实现;你甚至将看到底层的memory pool 和高阶抽象的traits 机制的实现。那些数据结构、那些算法、那些重要观念、那些编程实务中最重要最根本的珍宝,那些蜇伏已久彷佛已经还给老师的记忆,将重新在你的脑中闪闪发光。 目录回到顶部↑庖丁解牛(侯捷自序) i 目录 v 前言 xvii 本书定位 xvii 合适的读者 xviii 最佳阅读方式 xviii 我所选择的剖析对象 xix 各章主题 xx 编译工具 xx 中英术语的运用风格 xxi 英文术语采用原则 xxii 版面字形风格 xxiii 源码形式与下载 xxiv 在线服务 xxvi 推荐读物 xxvi 第1章 STL 概论与版本简介001 1.1 STL 概论 001 1.1.1 STL的历史 003 1.1.2 STLC++ 标准程序库 003 . 1.2 STL 六大组件 - 功能与运用 004 1.3 GNU源码开放精神 007 1.4 HP STL实现版本 009 1.5 P.J. Plauger STL实现版本 010 1.6 Rouge Wave STL实现版本 011 1.7 STLport 实现版本 012 1.8 SGI STL实现版本 总览 013 1.8.1 GNU C++ header 文件分布 014 1.8.2 SGI STL 文件分布与简介 016 STL 标准头文件(无扩展名) 017 C++ 标准规格定案前,HP规范的STL头文件(扩展名 .h) 017 SGI STL 内部文件(SGI STL真正实现于此) 018 1.8.3 SGI STL 的组态设定(configuration) 019 1.9可能令你困惑的C++ 语法 026 1.9.1 stl_config.h 中的各种组态 027 组态3:static template member 027 组态5:class template partial specialization 028 组态6:function template partial order 028 组态7:explicit function template arguments 029 组态8:member templates 029 组态10:default template argument depend on previous template parameters 030 组态11:non-type template parameters 031 组态:bound friend template function 032 组态:class template explicit specialization 034 1.9.2 临时对象的产生与运用 036 1.9.3 静态常数整数成员在class 内部直接初始化 037 in-class static const integral data member initialization 1.9.4 increment/decrement/dereference 运算子 037 1.9.5 "前闭后开"区间表示法 [ ) 039 1.9.6 function call运算子(operator()) 040 第2章 空间配置器(allocator) 043 2.1 空间配置器的标准接口 043 2.1.1 设计一个简单的空间配置器,JJ::allocator 044 2.2 具备次配置力(sub-allocation)的SGI 空间配置器 047 2.2.1 SGI 标准的空间配置器,std::allocator 047 2.2.2 SGI 特殊的空间配置器,std::alloc 049 2.2.3 构造和析构基本工具:construct() 和 destroy() 051 2.2.4 空间的配置与释
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值