C++ 头文件系列 (algorithm)
简介
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兼容的目的,bsearch
和 qsort
同时包含了C和C++的两个函数签名。
C++ 头文件系列 (algorithm)的更多相关文章
- C++ 头文件系列(array)
注意,该头文件仅在C++11中标准才开始出现. 简介 与语言内置的数组一样, array类模版支持几乎所有内置数组包含的特性: 顺序的(sequence) 内存连续的(contiguous stora ...
- C++ 头文件系列(iterator)
简介 该头文件围绕迭代器展开,定义了一系列与迭代器有关的概念,但最最最重要的一点就是----它和其它容器一起实现了C++容器的Iterator设计模式. Iterators are a general ...
- C++ 头文件系列(queue)
简介 这个头文件定义了两个跟队列有关的类----quque.priority_queue,分别实现的是队列 和 优先队列这两个概念. 但是与这两个类模版与其它类模版(vector.array等)最大的 ...
- C++ 头文件系列(stack)
简介 该头文件只含有一个类模版stack, 它实现栈的概念,是一个容器适配器(说实话,在写这篇随笔之前我都不知道有这么个类模版). 栈 栈只有一个重要的特性: LIFO(last-in first-o ...
- C++ 头文件系列(vector)
简介 vector头文件包含vector的类模版以及该模版的显示特化版本vector< bool >. vector是C++容器库中非常通用的一种容器,如果你不知道该决定使用哪一种容器,或 ...
- C++ 头文件系列(map)
简介 该头文件包含两个概念相似的容器----map.multimap. 而这两个容器反映的概念就是 映射. 这两个容器 相同 的属性有: 关联性 映射 动态增长 键(Key)唯一性 这两个不相同的属性 ...
- C++ 头文件系列(unordered_map、unordered_set)
简介 很明显,这两个头文件分别是map.set头文件对应的unordered版本. 所以它们有一个重要的性质就是: 乱序 如何乱序 这个unorder暗示着,这两个头文件中类的底层实现----Hash ...
- C++ 头文件系列 (bitset)
简介 该头文件有关位集,实际上是vector 位 位本质上对应bool的概念,只有0或1,true或false两种对立的值. 但很可惜,字节才是机器上最小的存储单元,所以bool基本上是由一个字节大小 ...
- C++ 头文件系列(iosfwd)
简介 输入输出历来都是语言的重要部分,在C++中,该库也是占据了相当大的一部分. C++的输入输出库是其遵循面向对象设计的结果,并结合了泛型编程. 以下是这些库类的关系图(箭头标示继承,白框表示摸板, ...
随机推荐
- source command not found in sh shell解决办法
在Ubuntu系统中执行脚本的时候突然出现错误"source command not found in sh shell" 这个其实在Ubuntu 当中 执行脚本默认的使用的是da ...
- Unity NGUI UIPanel下对粒子的剪裁
使用 unity 做游戏开发时,有时需要在scroll view下使用粒子,但粒子是不会被 UIPanel 所裁剪的,本人提供了脚本 ParticleSystemClipper,用来处理这种情况.思路 ...
- CodeForces 631B Print Check
对于每一个格子,看是行最后画还是列最后画.预处理一下就可以了. #include<stdio.h> #include<string.h> int n,m,k; +]; +]; ...
- 19、手把手教你Extjs5(十九)模块Grid的其他功能的设想
经过对自定义模块和Grid的设计和编码,现在已经能对一个有配置信息的模块来生成界面并进行一些简单的CURD操作.由于这是一个全解释性的前台的架构,因此你想到的任何新主意都可以放到所有的模块中. 比如对 ...
- js arguments.callee & caller的用法及区别
在函数内部,arguments.callee该属性是一个指针,指向拥有这个arguments对象的函数; 而函数对象的另一个属性:caller,这个属性保存着调用当前函数的函数的引用,如果是在全局作用 ...
- linux下JUCE源码编译依赖库
JUCE 源码https://github.com/julianstorer/JUCE 想在ubuntu下编译需要提前安装以下依赖库 sudo apt-get install mesa-common- ...
- IOS开发根据字体大小等获取文字所占的高度
Model *model = self.modelArr[indexPath.row]; //根据label文字获取CGRect NSMutableParagraphStyle *paragraphS ...
- .net中的4种事务总结
在 一个MIS系统中,没有用事务那就绝对是有问题的,要么就只有一种情况:你的系统实在是太小了,业务业务逻辑有只要一步执行就可以完成了.因此掌握事务处 理的方法是很重要,进我的归类在.net中大致有以下 ...
- 【Xilinx-Petalinux学习】-04-OpenCV的移植
交叉编译PC平台 VMware12, CentOS 6.5 32 bit 在VMware中安装CentOS,用户名:xilinx-arm-opencv 密码:root 至于这里为什么用CentOS,而 ...
- 大数据全栈式开发语言 – Python
前段时间,ThoughtWorks在深圳举办一次社区活动上,有一个演讲主题叫做“Fullstack JavaScript”,是关于用JavaScript进行前端.服务器端,甚至数据库(MongoDB) ...