注意:这篇文章上次更新于1555天前,文章内容可能已经过时。
This article was last updated1555 days ago, the content may be outdated.
提到 STL 算法,大家都知道很牛B。
但是想一想,除了 sort() , 你还会用啥呢?😂
最近抽时间把 STL 所有算法测试一遍,做到心里有个印象。
本文的这些示例基本上都来自于 cppreference.com 和 cplusplus.com
其实就是挨个看一遍,然后复制粘贴一下。
不修改序列的算法
all_of
检查谓词是否对所有元素生效,是返回 true ,否返回 false。
输入参数:
- 起始迭代器
- 终止迭代器
- 可调用对象(谓词条件)
函数行为:
1 | template <class InputIterator, class UnaryPredicate> |
示例代码:
1 |
|
any_of
检查谓词是否对部分元素生效,是返回 true ,否返回 false。
输入参数:
- 起始迭代器
- 终止迭代器
- 可调用对象(谓词条件)
函数行为:
1 | template <class InputIterator, class UnaryPredicate> |
示例代码:
1 |
|
none_of
检查谓词是否对全部元素都不生效,是返回 true ,否返回 false。
输入参数:
- 起始迭代器
- 终止迭代器
- 可调用对象(谓词条件)
函数行为:
1 | template <class InputIterator, class UnaryPredicate> |
示例代码:
1 |
|
for_each
输入参数:
- 起始迭代器
- 终止迭代器
- 可调用对象 fn
将 fn 作用在每一个对象身上。
函数行为:
1 | template <class InputIterator, class Function> |
示例代码:
1 |
|
find
输入参数:
- 起始迭代器
- 终止迭代器
- 查找的对象
返回满足条件的迭代器。
PS:从函数行为可以看出自定义对象需要重载 == 运算符。
函数行为:
1 | template <class InputIterator, class T> |
示例代码:
1 | // find example |
find_if
输入参数:
- 起始迭代器
- 终止迭代器
- 可调用对象
当可调用对象返回 true 时,返回该元素迭代器;查找失败返回终止迭代器。
函数行为:
1 | template <class InputIterator, class UnaryPredicate> |
示例代码:
1 | // find_if example |
find_if_not
性质基本同上
返回第一个不满足条件的元素迭代器,查找失败返回终止迭代器。
函数行为:
1 | template <class InputIterator, class UnaryPredicate> |
示例代码:
1 | // find_if_not example |
find_end
输入参数:
- 序列①起始迭代器
- 序列①终止迭代器
- 序列②起始迭代器
- 序列②终止迭代器
- 比较条件(重载版本,默认条件是 == )
在序列①中查找序列②最后一次出现的位置,查找成功返回序列①中相应的迭代器,查找失败返回序列①的终止迭代器。
函数行为:
1 | template <class ForwardIterator1, class ForwardIterator2> |
示例代码:
1 | // find_end example |
find_first_of
输入参数:
- 序列①起始迭代器
- 序列①终止迭代器
- 序列②起始迭代器
- 序列②终止迭代器
- 比较条件(重载版本,默认条件是 == )
在序列①中进行查找,返回首先满足该元素存在于序列②中的元素迭代器,查找失败返回第一个序列的终止迭代器。
PS: 这个函数和上一个不太一样,上一个是查全部,这个不是。
函数行为:
1 | template <class InputIterator, class ForwardIterator> |
示例代码:
1 | // find_first_of example |
adjacent_find
输入参数:
- 起始迭代器
- 终止迭代器
- 比较条件(重载版本,默认为 == )
在序列中查找第一个相等的相邻元素,查找失败返回终止迭代器。
函数行为:
1 | template <class ForwardIterator> |
示例代码:
1 | // adjacent_find example |
count
输入参数:
- 起始迭代器
- 终止迭代器
- 比较对象
在序列中统计与目标对象相等的元素数量。
PS:没有传入比较条件的参数(传入比较条件的算法叫 count_if ),意味着可能需要重载 == 运算符。
函数行为:
1 | template <class InputIterator, class T> |
示例代码:
1 | // count algorithm example |
count_if
整体同上,第三个参数为比较函数。
函数行为:
1 | template <class InputIterator, class UnaryPredicate> |
示例代码:
1 | // count_if example |
mismatch🚩
输入参数:
- 序列①起始迭代器
- 序列①终止迭代器
- 序列②起始迭代器
- 条件函数(重载版本)
一次比较序列①和序列②,返回第一次匹配失败的位置。返回为 pair 类型,分别记录两个序列第一个不匹配的迭代器。
函数行为:
1 | template <class InputIterator1, class InputIterator2> |
示例代码:
1 | // mismatch algorithm example |
都不需要检查第二个迭代器是否到头吗?
1 2 3 4 5 6
1 2 3
这样传两个序列岂不是 *first2 就越界了?
测试了以下,果然会乱七八糟。

equal
输入参数:
- 序列①起始迭代器
- 序列①终止迭代器
- 序列②起始迭代器
- 条件函数(重载版本)
检查序列②中以first2起始的序列是否包含序列①。
函数行为:
1 | template <class InputIterator1, class InputIterator2> |
示例代码:
1 | // equal algorithm example |
is_permutation🚩
输入参数:
- 序列①起始迭代器
- 序列①终止迭代器
- 序列②起始迭代器
- 条件函数(重载版本)
检查序列①是否是序列②的置换版本。
函数行为:
1 | template <class InputIterator1, class InputIterator2> |
示例代码:
1 | // is_permutation example |
search
输入参数:
- 序列①起始迭代器
- 序列①终止迭代器
- 序列②起始迭代器
- 序列②终止迭代器
- 比较条件(重载版本,默认条件是 == )
返回序列②在序列①中第一次出现的位置。
PS:与 find_end 对应。
函数行为:
1 | template <class ForwardIterator1, class ForwardIterator2> |
示例代码:
1 | // search algorithm example |
search_n
输入参数:
- 起始迭代器
- 终止迭代器
- 匹配连续元素的最少数量
- 比较对象
- 比较函数(重载版本)
在序列中查找连续n次与目标对象相等的元素的起始位置。
函数行为:
1 | template <class ForwardIterator, class Size, class T> |
示例代码:
1 | // search_n example |
BibiBibi
今天就先看到这了,该睡了。
留个思考题,为什么 mismatch , is_permutation , equal 都不需要传第二个容器的终止迭代器呢?而 search 和 find_end 却需要传入第二个容器的终止迭代器。
后半部分应该好回答,因为函数要实现的功能要求它必须要知道两个序列的长度。
对于前半部分还需要再研究研究,今天太晚了,脑子不清醒了。
难道是因为 C++ 设计理念的原因?我听过一种说法,C++ 是一门充分相信程序员的语言,Java 是一门充分不相信程序员的语言。也许这就是原因吧😂
02点30分


