简介

algorithm头文件是C++的标准算法库,它主要应用在容器上。 因为所有的算法都是通过迭代器进行操作的,所以算法的运算实际上是和具体的数据结构相分离的 ,也就是说,具有低耦合性。 因此,任何数据结构都能使用这套算法库,只要它具有相应的迭代器类型。

算法类别

如上图所示,库中的算法主要分为4类:

  • 非修改性顺序操作(Non-modifying sequence operations)
  • 可变顺序操作(Mutating sequence operations)
  • 排序和关系操作(Sorting and related operations)
  • C库算法(C library algorithms)

算法版本

用过这个算法库的人都知道,里面的很多算法都是成对出现的,一个概念的算法经常有多个版本:

  • in-place version: 普通版本,直接操作对迭代器进行操作。
  • copying version: 拷贝版本,需要传入输出迭代器作为拷贝的destination。 该版本一般带有copy字样。
  • predicate version: 谓词版本,需要传入谓词作为判断的标准。 该版本一般带有if字样。

Non-modifying sequence operations

  • all_of : 判断是否范围内的所有元素都满足条件。
  • any_of : 判断是否范围内的所有元素中有一个满足条件。
  • none_of : 判断是否范围内的所有元素中没有一个满足条件。
  • for_each : 对指定范围内的每一个元素进行指定的操作。
  • find、find_if、find_if_not : 在指定范围中查找满足某个条件(值相等、条件满足、条件不满足)的元素。
  • find_end : 在指定序列中查找最后一个相等(或满足谓词条件)子序列
  • find_first_of : 在指定序列中查找第一个出现在另一个序列中(或满足谓词条件)的元素
  • adjacent_find : 在指定序列中查找第一个相等(值相等、满足条件)的元素对(2个元素)。
  • count、count_if : 对制定序列中的满足条件(值相等、满足条件)的元素进行计数。
  • mismatch : 给定两个元素序列,返回第一个不匹配(值不相等、不满足条件)的元素位置,以一个迭代器对指出。
  • equal : 判断两个序列是否相等(值相等、满足谓词条件)。
  • is_permutation : 判断是否一个序列是另一个序列的排列,即只有排列方式不相等(值不相等、不满足谓词条件)。
  • search、search_n : 在给定序列中查找子序列或者n个重复的元素序列

Mutating sequence operations

  • copy、copy_n、copy_if、copy_backward : 拷贝序列、拷贝序列中前n个元素、拷贝序列中满足条件的、从后往前拷贝序列。
  • move、move_backward移动序列、从后往前移动序列(移动后,任然可以对源序列进行操作,但元素值是未指定的)。
  • swap、iter_swap逐元素交换序列、交换两个序列。
  • transform : 对一个 序列进行变换并输出、对两个序列进行变换并输出(变换通过自定义谓词来实现)。
  • replace、replace_if、replace_copy、replace_copy_if : 替换满足条件(值相等、满足谓词条件)的元素为给定元素、替换满足条件的元素并将其拷贝至别处。
  • fill、fill_n : 将给定序列元素填充为给定值、 将给定的前n个元素填充为给定值。
  • generate、generate_n : 用自定义的生成器生成元素,并将这些元素赋值给给定序列或前n个序列。
  • remove、remove_if : 移除相等或满足谓词条件的元素。 注意,若有元素被移除,指向这些元素之后的迭代器的可以使用,但结果是未指定的(unspecified)
  • unique、unique_copy使序列唯一(即若有重复元素,保留第一个,其余全部移除)、是序列唯一并拷贝至目的地。
  • reverse、reverse_copy : 将给定序列逆转、将给定序列逆转并拷贝至目的地。
  • rotate、rotate_copy : 将给定序列左旋转(middle - first)个元素、将给定序列左旋转(middle - first)个元素并拷贝。
  • shuffle : 使用均匀随机数生成器将给定序列洗牌(即打乱,重新分布)。

下面几个函数有关分区的同一方面,但又功能却不想上面所列那么相似,故而分开叙述:

  • is_partition : 用给定的一元谓词判断给定序列是否被正确分区(即前一部分元素调用谓词返回true,后一部分返回false)。
  • partition : 对给定序列进行分区操作
  • stable_partition : 与partition操作相似,但是两个group(即分区成的两个分区)内元素的相关顺序保持不变(stable)
  • partition_copy : 与partition相似,但是两个分区group结果被拷贝到两个指定的位置
  • partition_point返回分区点,该点之前、该点之后(包括该点)分别为两个分区。

Sorting and related operations

这些函数都有两个版本:使用operator < 的、使用函数子Compare的。

  • sort : 排序。
  • stable_sort : 稳定排序。
  • partial_sort : 部分排序,对于给定的序列,只排序前middle - first个元素,并将它们放置在[first, middle)范围中,剩余位置的元素顺序为指定。
  • partial_sort_copy : paartial_sort函数的copy版本。
  • is_sorted、is_sorted_util : 判断给定序列是否为已排序(使用operator < 或 自定义函数子判断)的。
  • nth_element : 将nth迭代器指定的位置排序为结果元素。(实际上应该是使用快排实现的)
  • lower_bound、upper_bound、equal_range : 返回下界、上界、相等性范围。
  • binary_search : 在给定序列中对元素进行二分查找。
  • merge、inplace_merge : 合并两个序列并输出。
  • includes : 判断是否一个序列重的所有元素都被包含在另一个序列中。
  • set_union并集
  • set_intersection交集
  • set_difference差集
  • set_symmetric_difference对称差集
  • push_heap : 将一个元素push进由序列表示的heap中,并维持堆得性质。
  • pop_heap : 将一个元素从heap中pop(实际上被交换到尾部)。
  • make_heap : 将给定序列构造成heap。
  • sort_heap : 对给定堆进行排序(可能有特殊的算法对堆排序进行优化)。
  • is_heap、is_heap_util : 判断给定序列是否为堆、判断给定序列到哪个位置之前为堆。
  • min、max : 返回最小值、最大值。
  • minmax : 返回pair
  • min_element、max_element : 返回序列中第一个最小值、最大值。
  • minmax_element : 返回pair
  • lexicographical_compare : 对两个序列进行字典序排序。
  • next_permutation、prev_permutation : 判断给定序列是否存在下一个或者上一个组合(所有可能的排列组合先由字典序排序,再进行判断)。

C library algorithms

该头文件还包含了标准C头文件stdlib.h,大体相同。 只是出于与C兼容的目的,bsearchqsort同时包含了C和C++的两个函数签名。

C++ 头文件系列 (algorithm)的更多相关文章

  1. C++ 头文件系列(array)

    注意,该头文件仅在C++11中标准才开始出现. 简介 与语言内置的数组一样, array类模版支持几乎所有内置数组包含的特性: 顺序的(sequence) 内存连续的(contiguous stora ...

  2. C++ 头文件系列(iterator)

    简介 该头文件围绕迭代器展开,定义了一系列与迭代器有关的概念,但最最最重要的一点就是----它和其它容器一起实现了C++容器的Iterator设计模式. Iterators are a general ...

  3. C++ 头文件系列(queue)

    简介 这个头文件定义了两个跟队列有关的类----quque.priority_queue,分别实现的是队列 和 优先队列这两个概念. 但是与这两个类模版与其它类模版(vector.array等)最大的 ...

  4. C++ 头文件系列(stack)

    简介 该头文件只含有一个类模版stack, 它实现栈的概念,是一个容器适配器(说实话,在写这篇随笔之前我都不知道有这么个类模版). 栈 栈只有一个重要的特性: LIFO(last-in first-o ...

  5. C++ 头文件系列(vector)

    简介 vector头文件包含vector的类模版以及该模版的显示特化版本vector< bool >. vector是C++容器库中非常通用的一种容器,如果你不知道该决定使用哪一种容器,或 ...

  6. C++ 头文件系列(map)

    简介 该头文件包含两个概念相似的容器----map.multimap. 而这两个容器反映的概念就是 映射. 这两个容器 相同 的属性有: 关联性 映射 动态增长 键(Key)唯一性 这两个不相同的属性 ...

  7. C++ 头文件系列(unordered_map、unordered_set)

    简介 很明显,这两个头文件分别是map.set头文件对应的unordered版本. 所以它们有一个重要的性质就是: 乱序 如何乱序 这个unorder暗示着,这两个头文件中类的底层实现----Hash ...

  8. C++ 头文件系列 (bitset)

    简介 该头文件有关位集,实际上是vector 位 位本质上对应bool的概念,只有0或1,true或false两种对立的值. 但很可惜,字节才是机器上最小的存储单元,所以bool基本上是由一个字节大小 ...

  9. C++ 头文件系列(iosfwd)

    简介 输入输出历来都是语言的重要部分,在C++中,该库也是占据了相当大的一部分. C++的输入输出库是其遵循面向对象设计的结果,并结合了泛型编程. 以下是这些库类的关系图(箭头标示继承,白框表示摸板, ...

随机推荐

  1. phpstrom 2016.2 注册服务器地址

    无意中发现的,亲测可用:http://114.215.133.70:41017

  2. (简单) POJ 2387 Til the Cows Come Home,Dijkstra。

    Description Bessie is out in the field and wants to get back to the barn to get as much sleep as pos ...

  3. [Unity Physics]Physics - Rigidbody、Collider

    什么是Collider 碰撞器组件在Unity引擎中触发物理碰撞的最基本的条件. 可以这样说,假如一个游戏中没有物理碰撞系统是不可能的. 什么是Rigidbody 通过物理模拟的控制对象的位置. Ri ...

  4. jquery判断对象的type

    利用Object.toString.call()方法 看代码 先初始化class2type,将每种对象的toString后的值和type建立对应关系 core_toString.call([])输出& ...

  5. 最小化安装Linux记录

    挂载点: /boot 挂载点  100M swap 交换分区 / 根分区 最小化安装: 基本--基本.兼容库.调试工具 开发--开发工具 修改hostname 永久设置:/etc/sysconfig/ ...

  6. SQLite用法

    SQLite语法:http://blog.csdn.net/ejzhang/article/details/6224915#08 SQLite查询优化:1.http://www.eoeandroid. ...

  7. 【转】安卓必备Java基础

    [转]http://www.zhihu.com/question/19937886(里面提到的知识点的链接) 1. Java 语言基础 谈到Java 语言基础学习的书籍,大家肯定会推荐Bruce Ec ...

  8. Swing 窗口的最小化到系统图标与还原

    2014年2月26日 13:01:47 一个上午的功夫,终于折腾好了. 上午主要是卡在监听事件的参数问题.当时脑子不好使,忘记事件是自己构造的,傻傻的测试了半天,如何传递窗口的参数 等中午解决的时候, ...

  9. [NOI2011]阿狸的打字机(好题!!!!)

    2785: [NOI2011]阿狸的打字机 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 7  Solved: 3[Submit][Status][We ...

  10. ios framework 开发实战 之 参考

    WWDC2014之iOS使用动态库 iOS开发——创建你自己的Framework 使用CocoaPods开发并打包静态库 iOS Framework 和CocoaPods TDD的iOS开发初步以及K ...