STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。

整个STL是以一种类型参数化(type parameterized)的方式实现的,这种方式基于一个在早先C++标准中没有出现的语言特性--模板(template)。如果查阅任何一个版本的STL源代码,你就会发现,模板作为构成整个STL的基石是一件千真万确的事情。除此之外,还有许多C++的新特性为STL的实现提供了方便;

STL算法部分主要由头文件<algorithm>,<numeric>,<functional>组成。要使用 STL中的算法函数必须包含头文件<algorithm>,对于数值算法须包含<numeric>,<functional>中则定义了一些模板类,用来声明函数对象。
STL中算法大致分为四类:
        1、非可变序列算法:指不直接修改其所操作的容器内容的算法。
        2、可变序列算法:指可以修改它们所操作的容器内容的算法。
        3、排序算法:包括对序列进行排序和合并的算法、搜索算法以及有序序列上的集合操作。
        4、数值算法:对容器内容进行数值计算。

以下对所有算法进行细致分类并标明功能:
<一>查找算法(13个):判断容器中是否包含某个值

  adjacent_find:    在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的ForwardIterator。否则返回last。重载版本使用输入的二元操作符代替相等的判断。
  binary_search:     在有序序列中查找value,找到返回true。重载的版本实用指定的比较函数对象或函数指针来判断相等。
  count:         利用等于操作符,把标志范围内的元素与输入值比较,返回相等元素个数。
  count_if:           利用输入的操作符,对标志范围内的元素进行操作,返回结果为true的个数。
  equal_range:       功能类似equal,返回一对iterator,第一个表示lower_bound,第二个表示upper_bound。
  find:          利用底层元素的等于操作符,对指定范围内的元素与输入值进行比较。当匹配时,结束搜索,返回该元素的一个InputIterator。
  find_end:             在指定范围内查找"由输入的另外一对iterator标志的第二个序列"的最后一次出现。找到则返回最后一对的第一个ForwardIterator,否则返回输入的"另外一对"的第一个ForwardIterator。重载版本使用用户输入的操作符代替等于操作。
  find_first_of:          在指定范围内查找"由输入的另外一对iterator标志的第二个序列"中任意一个元素的第一次出现。重载版本中使用了用户自定义操作符。
  find_if:                  使用输入的函数代替等于操作符执行find。
  find_if_not:            跟find_if刚好相反,返回第一个不符合要求的元素的迭代器。如果没有匹配的,则返回last
  lower_bound:      返回一个ForwardIterator,指向在有序序列范围内的可以插入指定值而不破坏容器顺序的第一个位置。重载函数使用自定义比较操作。
  upper_bound:      返回一个ForwardIterator,指向在有序序列范围内插入value而不破坏容器顺序的最后一个位置,该位置标志一个大于value的值。重载函数使用自定义比较操作。
  search:                 给出两个范围,返回一个ForwardIterator,查找成功指向第一个范围内第一次出现子序列(第二个范围)的位置,查找失败指向last1。重载版本使用自定义的比较操作。
  search_n:              在指定范围内查找val出现n次的子序列。重载版本使用自定义的比较操作。

<二>排序和通用算法(14个):提供元素排序策略
    inplace_merge:          合并两个有序序列,结果序列覆盖两端范围。重载版本使用输入的操作进行排序。
    merge:                     合并两个有序序列,存放到另一个序列。重载版本使用自定义的比较。
    nth_element:            将范围内的序列重新排序,使所有小于第n个元素的元素都出现在它前面,而大于它的都出现在后面。重载版本使用自定义的比较操作。
    partial_sort:              对序列做部分排序,被排序元素个数正好可以被放到范围内。重载版本使用自定义的比较操作。
    partial_sort_copy:     与partial_sort类似,不过将经过排序的序列复制到另一个容器。
    partition:                  对指定范围内元素重新排序,使用输入的函数,把结果为true的元素放在结果为false的元素之前。
    random_shuffle:        对指定范围内的元素随机调整次序。重载版本输入一个随机数产生操作。
    reverse:                   将指定范围内元素重新反序排序。
    reverse_copy:           与reverse类似,不过将结果写入另一个容器。
    rotate:                     将指定范围内元素移到容器末尾,由middle指向的元素成为容器第一个元素。
    rotate_copy:             与rotate类似,不过将结果写入另一个容器。
    sort:                        以升序重新排列指定范围内的元素。重载版本使用自定义的比较操作。

is_sorted:        检测指定范围的元素是否排序

    stable_sort:              与sort类似,不过保留相等元素之间的顺序关系。
    stable_partition:        与partition类似,不过不保证保留容器中的相对顺序。

<三>删除和替换算法(15个)

copy:         复制序列
    copy_if:         当满足条件时拷贝
    copy_n:         拷贝指定个元素
    copy_backward:    与copy相同,不过元素是以相反顺序被拷贝。

iter_swap:                交换两个ForwardIterator的值。
    remove:                   删除指定范围内所有等于指定元素的元素。注意,该函数不是真正删除函数。内置函数不适合使用remove和remove_if函数。
    remove_copy:           将所有不匹配元素复制到一个制定容器,返回OutputIterator指向被拷贝的末元素的下一个位置。
    remove_if:                删除指定范围内输入操作结果为true的所有元素。
    remove_copy_if:       将所有不匹配元素拷贝到一个指定容器。
    replace:                   将指定范围内所有等于vold的元素都用vnew代替。
    replace_copy:           与replace类似,不过将结果写入另一个容器。
    replace_if:                将指定范围内所有操作结果为true的元素用新值代替。
    replace_copy_if:        与replace_if,不过将结果写入另一个容器。
    swap:                      交换存储在两个对象中的值。
    swap_range:            将指定范围内的元素与另一个序列元素值进行交换。
    unique:                   清除序列中重复元素,和remove类似,它也不能真正删除元素。重载版本使用自定义比较操作。
    unique_copy:           与unique类似,不过把结果输出到另一个容器。

<四>排列组合算法(2个):提供计算给定集合按一定顺序的所有可能排列组合
    next_permutation:    取出当前范围内的排列,并重新排序为下一个排列。重载版本使用自定义的比较操作。
    prev_permutation:    取出指定范围内的序列并将它重新排序为上一个序列。如果不存在上一个序列则返回false。重载版本使用自定义的比较操作。

<五>算术算法(4个)
    accumulate:              iterator对标识的序列段元素之和,加到一个由val指定的初始值上。重载版本不再做加法,而是传进来的二元操作符被应用到元素上。
    partial_sum:             创建一个新序列,其中每个元素值代表指定范围内该位置前所有元素之和。重载版本使用自定义操作代替加法。
    inner_product:         对两个序列做内积(对应元素相乘,再求和)并将内积加到一个输入的初始值上。重载版本使用用户定义的操作。
    adjacent_difference:  创建一个新序列,新序列中每个新值代表当前元素与上一个元素的差。重载版本用指定二元操作计算相邻元素的差。

<六>生成和异变算法(6个)
    fill:                    将输入值赋给标志范围内的所有元素。
    fill_n:            将输入值赋给first到first+n范围内的所有元素。
    for_each:     用指定函数依次对指定范围内所有元素进行迭代访问,返回所指定的函数类型。该函数不得修改序列中的元素。
    generate:           连续调用输入的函数来填充指定的范围。
    generate_n:        与generate函数类似,填充从指定iterator开始的n个元素。
    transform:          将输入的操作作用与指定范围内的每个元素,并产生一个新的序列。重载版本将操作作用在一对元素上,另外一个元素来自输入的另外一个序列。结果输出到指定容器。

<七>关系算法(8个)
    equal:             如果两个序列在标志范围内元素都相等,返回true。重载版本使用输入的操作符代替默认的等于操作符。
    includes:         判断第一个指定范围内的所有元素是否都被第二个范围包含,使用底层元素的<操作符,成功返回true。重载版本使用用户输入的函数。
    lexicographical_compare:  比较两个序列。重载版本使用用户自定义比较操作。
    max:                  返回两个元素中较大一个。重载版本使用自定义比较操作。
    max_element:    返回一个ForwardIterator,指出序列中最大的元素。重载版本使用自定义比较操作。
    min:                返回两个元素中较小一个。重载版本使用自定义比较操作。
    min_element:   返回一个ForwardIterator,指出序列中最小的元素。重载版本使用自定义比较操作。

minmax_element: 返回指定范围内的最大最小值的元素的迭代器组成的一个pair
    mismatch:         并行比较两个序列,指出第一个不匹配的位置,返回一对iterator,标志第一个不匹配元素位置。如果都匹配,返回每个容器的last。重载版本使用自定义的比较操作。

<八>条件判断算法(3个)

  all_of:         在指定范围中判断容器中是否所有元素满足条件
  any_of:       在指定范围中判断容器中是否有元素满足条件
    none_of:     在指定范围中判断容器中是否没有任何元素满足条件

<九>集合算法(4个)
    set_union:                  构造一个有序序列,包含两个序列中所有的不重复元素。重载版本使用自定义的比较操作。
    set_intersection:          构造一个有序序列,其中元素在两个序列中都存在。重载版本使用自定义的比较操作。
    set_difference:            构造一个有序序列,该序列仅保留第一个序列中存在的而第二个中不存在的元素。重载版本使用自定义的比较操作。
    set_symmetric_difference: 构造一个有序序列,该序列取两个序列的对称差集(并集-交集)。
 
<十>堆算法(4个)
    make_heap:    把指定范围内的元素生成一个堆。重载版本使用自定义比较操作。
    pop_heap:         并不真正把最大元素从堆中弹出,而是重新排序堆。它把first和last-1交换,然后重新生成一个堆。可使用容器的back来访问被"弹出"的元素或者使用pop_back进行真正的删除。重载版本使用自定义的比较操作。
    push_heap:    假设first到last-1是一个有效堆,要被加入到堆的元素存放在位置last-1,重新生成堆。在指向该函数前,必须先把元素插入容器后。重载版本使用指定的比较操作。
    sort_heap:        对指定范围内的序列重新排序,它假设该序列是个有序堆。重载版本使用自定义比较操作。

C++11 STL算法简介的更多相关文章

  1. C++ 11 STL算法

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

  2. STL——算法简介

    一.算法概观 以有限的步骤,解决逻辑或数学上的问题,这一专门科目我们称为算法.特定的算法往往搭配特定的数据结构,例如binary search tree(二叉搜索树)和 RB-tree 便是为了解决查 ...

  3. STL所有算法简介 (转) http://www.cnblogs.com/yuehui/archive/2012/06/19/2554300.html

    STL所有算法简介 STL中的所有算法(70个) 参考自:http://www.cppblog.com/mzty/archive/2007/03/14/19819.htmlhttp://hi.baid ...

  4. 【STL源码学习】STL算法学习之二

    第一章:前言 学习笔记,记录学习STL算法的一些个人所得,在以后想用的时候可以快速拾起. 第二章:明细 copy 函数原型: template <class InputIterator, cla ...

  5. STL的简介

    Standard Template Library,(标准模板库)<来自百度百科的整理> ————可复用性(reusability) STL是基于模板,内联函数的使用使得生成的代码短小高效 ...

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

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

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

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

  8. STL源代码分析——STL算法remove删除算法

    前言 因为在前文的<STL算法剖析>中,源代码剖析许多.不方便学习,也不方便以后复习,这里把这些算法进行归类.对他们单独的源代码剖析进行解说.本文介绍的STL算法中的remove删除算法. ...

  9. 排列熵算法简介及c#实现

    一.   排列熵算法简介: 排列熵算法(Permutation Entroy)为度量时间序列复杂性的一种方法,算法描述如下: 设一维时间序列: 采用相空间重构延迟坐标法对X中任一元素x(i)进行相空间 ...

随机推荐

  1. Ubuntu16.04 安装Processing

    下载 在 https://processing.org/ 上下载最新的linux 64bit版本gzip文件, 当前是 http://download.processing.org/processin ...

  2. 在子线程中发送短信,静态注册SentMsgReceiver。

    1. 应该在子线程中执行发送短信的操作. 如果没有在子线程中发送短信会出现错误:点击发送短信之后,立即跳转到其他界面,那么这次发送短信可能就会失败! 请注意往子线程方法中传入外部的实参必须由final ...

  3. 一个使用Servlet文件实现文件下载的实例

    一个使用Servlet文件实现文件下载的实例 (可以扩充本实例实现:对用户隐藏他要下载文件的路径,或者在下载文件时要做一些其他的工作,如检查用户有没有下载此文件的权限等) 了解在Servlet中如何控 ...

  4. 使用userAgent判断使用的是什么浏览器

    <script type="text/javascript"> function validB(){ var u_agent = Navigator.userAgent ...

  5. ios持久化存储

    前言 iOS中常用的持久化存储方式有好几种: 偏好设置(NSUserDefaults) plist文件存储 归档 SQLite3 Core Data 沙盒 每个iOS应用都有自己的应用沙盒(应用沙盒就 ...

  6. 一台电脑存放多个git账户的多个rsa秘钥(转)

    如何在一个电脑上存储多个git账户生成的多份rsa秘钥,实现多个账户同时使用配置的情况?今天,不幸又再次遇到这个问题. 问题描述 公司最近在开发一款开源产品,项目被托管在github上,但是公司内部一 ...

  7. 【jQuery】jquery插件封装

    扩展jQuery插件开发的基本知识,最佳做法和常见的陷阱. 入门 编写一个jQuery插件开始于给jQuery.fn加入​​新的功能属性,此处添加的对象属性的名称就是你插件的名称: jQuery.fn ...

  8. 《JAVA与模式》之简单工厂与工厂方法

    一.简单工厂 1.1 使用场景 1.工厂类负责创建的对象比较少: 2.客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心: 3.由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情 ...

  9. PostgreSQL创建数据库用户

    注:版本不同,命令的执行路径可能有些不同. 一. 创建数据库用户freeswitch sudo -u postgres /usr/pgsql-9.5/bin/createuser -s -e free ...

  10. echarts 与 百度地图bmap结合系列: 如何设置地图缩放级别和监听缩放事件

    简单的demo: // ehcarts 的实例对象 this.myChart = echarts.init(el) // ehcarts加载完成事件 this.myChart.on('finished ...