STL算法主要是我们强大的标准库中以迭代器或数值或函数对象为参数预先定义好的一系列算法操作。

在STL算法分类中首先要提的就是两个普遍存在的后缀:

_if

_copy

其中这两个后缀的作用分别是:一、对于_if,如果算法存在两种形式,参数的个数相同,其中一种形式的参数要求传递一个值,而另一种形式则会要求传递一个函数或仿函数(函数对象),那么则没有_if后缀的形式要求传递数值,有_if后缀的则要求传递函数。而且传递的函数一般都会是一个一元或二元的判别式。二、_copy后缀则表示在此算法中元素在被复制到目标区间的同时会被处理,而源序列则保持不变。

除此之外,STL算法可以按照其操作的特性分为一下几个类别:

一、非变动性算法

非变动性算法主要是指不会改变元素的次序和改变元素值的操作,典型的操作是:计数count、求最值(min_element,max_element)、搜寻某个特定元素find、搜寻某段特定元素search_n、搜寻某个子区间(search,find_end)、搜寻第一对连续相等的元素adjacent_find、其次剩余的就是匹配和比较算法了:判断两个连续的区间是否相等equal、在两个序列中返回第一对不想等的元素

二、变动性算法

变动性算法指的是要么直接改变元素值,或者在复制到目标区间的过程中改变元素值且原区间不发生改变。首先要记的是两个特殊的算法:复制和合并:copy从第一个元素开始复制到目标区间、merge合并两个区间;其次就是遍历操作每一个元素for_each、遍历+操作+复制transform(遍历操作复制后原区间不会变,操作的结果覆盖到目标区间,注意既可以对一个原区间间进行一元操作,也可以同时对两个原区间进行二元操作后将结果覆盖到目标区间)、最后就是替换操作:可以批量替换区间的每一个元素:fill以给定值替换区间的所有元素、generate以某项操作的结果替换区间所有元素;替换区间中N个元素:fill_n以给定值替换区间的前N个元素、generate_n以某项操作的结果替换区间的前N个元素,以另一个元素替换某个特定元素replace。

三、移除性算法

移除性算法可以移除某区间内的特定元素也可以在复制到目标区间的过程中去执行移除动作。

不过需要特别注意的是:除了在复制的过程中移除外,其他的移除事实上都只是在逻辑上移除元素,具体的手段是:将不需要被移除的元素往前移覆盖应该被移除的元素,因此这些操作并不改变操作区间内的元素个数,而是返回逻辑上的新终点位置。

移除性算法中最重要就两个操作:一是移除某些特定的元素(包括移除和复制移除);remove移除特定值的元素、remove_if移除满足条件元素、remove_copy复制移除特定元素、remove_copy_if复制移除满足特定条件的元素。二是移除相邻的重复元素:unique移除相邻的重复元素、unique_copy复制并移除相邻的重复元素。注意如果想通过unique算法移除掉序列里的所有重复元素则必须先对序列排序,使其成员有序序列后则用unique移除相邻重复的元素后才能使该序列不包含重复的元素。

四、变序性算法

变序性算法指的是改变序列中元素的顺序但不改变元素的值。

变序算法中最主要的几个操作是:逆转、旋转、分步排序、随机乱序,部分前移

逆序算法:reverse将元素次序逆转、reverse_copy复制的同时逆转元素顺序;旋转元素次序:rotate按参数旋转元素顺序、rotate_copy复制的同时旋转元素次序;分步排序:next_permutation得出朝向降序的下一步变换序列、prev_permutation得出朝着升序的下一步变换序列;随机乱序:random_shuffle将元素次序随机打乱。部分前移算法:partition使满足特定条件的元素移到序列的前面、stable_partition与partition一样也是使满足特定条件的元素移到序列的前面,但是stable_partition保存满足条件和不满足条件的各个元素间的原有相对位置不变。

五、排序算法

排序算法主要是指使序列的全部元素或部分元素或特定位置成为有序的,这与变序算法不同,排序算法中的有序是指排列成升序或降序而变序算法中的有序不一定如此。

排序算法中主要包括的是;对所有位置排序、对部分位置排序、对单个特定位置排序。

对所有位置排序:sort对序列中的所有元素进行排序、stable_sort对所有元素进行排序但是保持相等的元素间的原有相对次序。对部分位置排序:partial_sort对所有元素排序,直到前n个元素就位、partial_sort_copy以目标区间的大小为准对原区间进行复制并排序直到保持相对应的前部分位置有序位置。对单个特定位置进行排序:nth_element对所有元素排序使第n个位置的相应元素就位,并且使位于位置n之前的元素都小于它,位于位置n之后的元素都大于它。

六、对已序区间的算法

对依已序区间的算法主要是值根据原区间元素已序的特定采用特定的算法进行相应的操作,使得这些操作一般通用的操作具有更高的效率,但必备的前提都是该用于操作的原区间必须都是已序序列。

已序算法中主要包括:搜寻、区间合并、集合并集、交集、差集、并集-交集。

搜寻算法:binary_search用二分法搜寻是否包括特定元素、includes搜寻一个区间是否包含另一个区间的全部元素、lower_bound搜寻第一个大于等于给定值的元素、upper_bound搜寻第一个大于给定值的元素、equal_range搜寻等于给定值的区间范围返回数值对。区间合并:merge将两个区间的元素合并、inplace_merge将两个连续的已序区间合并成一个有序区间。并集:set_union求两个区间的并集。交集:set_intersection求两个区间的交集。差集:set_difference求第一个区间与第二个区间的差集。并集-交集:set_symmetric_difference求只出现在两个区间之一的元素并形成一个已序区间。

七、数值运算

数值运算算法指的是以不同的方式组合数值元素。

数值算法中的主要算法包括:accumulate组合一个区间所有元素,以传进初始值参数为准可以进行迭加运算,也可以传进特定的操作函数后,以初始值参数进行迭代运算。inner_product组合两个区间的所有元素,可以是两个区间的对于位置的元素的乘积与初始值参数迭加,也可以传入两个特定参数两个区间的相应位置的元素进行二元操作后在迭代。adjacent_difference将每个元素和其前的一个元素进行组合,每一个元素都与其前面的一个元素相减后进行特定二元操作后将结果另写入一个目标序列。partial_sum将每个元素和其先前的所有元素组合,可以是每一个元素与其所有先前的元素累计或累积进行特定操作后将结果保存写入目标区间。

http://blog.csdn.net/yyc1023/article/details/38558955

STL算法分类记忆的更多相关文章

  1. C++ 之高效使用STL ( STL 算法分类)

    http://blog.csdn.net/zhoukuo1981/article/details/3452118

  2. 从零开始学C++之STL(四):算法简介、7种算法分类

    一.算法 算法是以函数模板的形式实现的.常用的算法涉及到比较.交换.查找.搜索.复制.修改.移除.反转.排序.合并等等. 算法并非容器类型的成员函数,而是一些全局函数,要与迭代器一起搭配使用. 算法的 ...

  3. [Machine Learning] 机器学习常见算法分类汇总

    声明:本篇博文根据http://www.ctocio.com/hotnews/15919.html整理,原作者张萌,尊重原创. 机器学习无疑是当前数据分析领域的一个热点内容.很多人在平时的工作中都或多 ...

  4. paper 12:机器学习常见算法分类汇总

    机器学习无疑是当前数据分析领域的一个热点内容.很多人在平时的工作中都或多或少会用到机器学习的算法.这里南君先生为您总结一下常见的机器学习算法,以供您在工作和学习中参考. 机器学习的算法很多.很多时候困 ...

  5. STL算法

    STL算法部分主要由头文 件<algorithm>,<numeric>,<functional>组成.要使用 STL中的算法函数必须包含头文件<algorit ...

  6. 【STL源码学习】STL算法学习之三

    第一章:前言 数量不多,用到的时候会很爽. 第二章:明细 STL算法中的又一个分类:分割:将已有元素按照既定规则分割成两部分.  is_partitioned 函数原型: template <c ...

  7. 【转】三十分钟学会STL算法

    转载自: http://net.pku.edu.cn/~yhf/UsingSTL.htm 这是本小人书.原名是<using stl>,不知道是谁写的.不过我倒觉得很有趣,所以化了两个晚上把 ...

  8. random_shuffle (stl算法)打乱顺序 - 飞不会的日志 - 网易博客

    random_shuffle (stl算法)打乱顺序 - 飞不会的日志 - 网易博客 random_shuffle (stl算法)打乱顺序 2012-03-31 10:39:11|  分类: 算法 | ...

  9. C++STL 算法

    算法部分主要由头文件<algorithm>,<numeric>和<functional>组成. <algorithm>是所有STL头文件中最大的一个,其 ...

随机推荐

  1. 在win7系统设置SQL Server2014 express为远程数据

    如何设置远程访问到SQLserver服务器(局域网内的设置) 1.首先,使用Windows+R键 输入services.msc 打开本地服务. *说明:①MSSQLSERVER是正式使用的SQL创建实 ...

  2. gVim安装vim-template插件后提示Undefined variable vim_template_subtype/Press ENTER or type command to continue

    Win7 64位 gVim:version 8.1.1234 vim-template:github链接 安装方式: 直接下载master的zip压缩包,解压后放入本地gVim安装目录的plugin, ...

  3. 一个数字键盘引发的血案——移动端H5输入框、光标、数字键盘全假套件实现

    https://juejin.im/post/5a44c5eef265da432d2868f6 为啥要写假键盘? 还是输入框.光标全假的假键盘? 手机自带的不用非得写个假的,吃饱没事干吧? 装逼?炫技 ...

  4. 使用java配置来构建spring项目

    java配置是Spring4.x推荐的配置方式,可以完全代替xml配置,java配置是通过@Configuration和@Bean来实现的.@Configuration声明当前类是一个配置类,相当于S ...

  5. MySQL限制查询结果返回的数量limit

    1限制查询结果 [limit {[offset,] row_count | row_count offset}] row_count 起始行(第一行是0) offset 偏移量 输出几行记录

  6. 关于在真实物理机器上用cloudermanger或ambari搭建大数据集群注意事项总结、经验和感悟心得(图文详解)

    写在前面的话 (1) 最近一段时间,因担任我团队实验室的大数据环境集群真实物理机器工作,至此,本人秉持负责.认真和细心的态度,先分别在虚拟机上模拟搭建ambari(基于CentOS6.5版本)和clo ...

  7. 8、在Shell脚本中使用函数

    学习目标Shell的函数 Shell程序也支持函数.函数能完成一特定的功能,可以重复调用这个函数.函数格式如下: 函数名() {     函数体 }   函数调用方式: 函数名 参数列表   实例:编 ...

  8. ComboBox ItemHeight 再高一点

    public static void BindData(this ComboBox box, List<KeyValuePair<long, string>> data) { ...

  9. mac安装rz,sz文件操作指令包

    安装需要具备什么样的环境? 1.安装item2 iterm2是一个与terminal一样的指令窗口 item2 下载地址,​​http://iterm2.com/downloads.html,下载后解 ...

  10. openJDK的下载

    http://jdk7.java.net/source.html # 失效 http://download.java.net/openjdk/jdk7 # 无效,点击文件下载跳转错误页面 http:/ ...