标准模板库(STL)三:STL算法之不变序列算法

STL算法

STL中的算法大致可以分为以下七类:

  • 不变序列算法
  • 变值算法
  • 删除算法
  • 变序算法
  • 排序算法
  • 有序区间算法
  • 数值算法

大多重载的算法都是有两个版本的

  • 用 “==” 判断元素是否相等, 或用 “<” 来比较大小
  • 多出一个类型参数 Pred和函数形参 Pred op : 通过表达式 op(x,y)的返回值: ture/false 判断x是否 “等于” y,或者x是否 “小于” y

不变序列算法

  • 该类算法不会修改算法所作用的容器或对象
  • 适用于顺序容器和关联容器
  • 时间复杂度都是O(n),因为往往会遍历元素
算法功能
min求两个对象中较小的(可自定义比较器)
max求两个对象中较大的(可自定义比较器)
min_element求区间中的最小值(可自定义比较器)
max_element求区间中的最大值(可自定义比较器)
for_each对区间中的每个元素都做某种操作
count计算区间中等于某值的元素个数==
count_if计算区间中符合某种条件的元素个数
find在区间中查找等于某值的元素==
find_if在区间中查找符合某条件的元素
find_end在区间中查找另一个区间最后一次出现的位 置(可自定义比较器)
find_first_of在区间中查找第一个出现在另一个区间中的 元素 (可自定义比较器)
adjacent_find在区间中寻找第一次出现连续两个相等元素 的位置(可自定义比较器)
search在区间中查找另一个区间第一次出现的位置(可 自定义比较器)
search_n在区间中查找第一次出现等于某值的连续n个元 素(可自定义比较器)
equal判断两区间是否相等(可自定义比较器)
mismatch逐个比较两个区间的元素,返回第一次发生不 相等的两个元素的位置(可自定义比较器)
lexicographical_compare按字典序比较两个区间的大小(可自定义比较器)

find

template<class InIt, class T>
InIt find(InIt first, InIt last, const T &val);
  • 返回区间 [first,last) 中的迭代器i,使得 *i == val。如果没找到,返回last

find_if

template<class InIt, class Pred>
InIt find_if(InIt first, InIt last, Pred pr);
  • 返回区间 [first,last) 中的迭代器i, 使得 pr(*i) == true

for_each

template<class InIt, class Fun>
Fun for_each(InIt first, InIt last, Fun f);
  • 对[first, last)中的每个元素e, 执行f(e), 要求 f(e)不能改变e

count

template<class InIt, class T>
size_t count(InIt first, InIt last, const T &val);
  • 计算[first, last) 中等于val的元素个数(x==y为true算等于)

count_if

template<class InIt, class Pred>
size_t count_if(InIt first, InIt last, Pred pr);
  • 计算[first, last) 中符合pr(e) == true 的元素e的个数

min_element

template<class FwdIt>
FwdIt min_element(FwdIt first, FwdIt last);
  • 返回[first,last) 中最小元素的迭代器, 以 < 作比较器
  • 最小指没有元素比它小, 而不是它比别的不同元素都小,因为即便a!= b, a<bb<a有可能都不成立

max_element

template<class FwdIt>
FwdIt max_element(FwdIt first, FwdIt last);
  • 返回[first,last) 中最大元素(不小于任何其他元素)的迭代器
  • < 作比较器

关于<的例子

#include<iostream>
#include<algorithm>
using namespace std;
class A {
public:
	int n;
	A(int i) : n(i) {}
};
bool operator<(const A &a1, const A &a2) {
	cout << "<called" << endl;
	if (a1.n == 3 && a2.n == 7)
		return true;
	return false;
}
int main() {
	A aa[] = { 3,5,7,2,1 };
	cout << min_element(aa, aa + 5)->n << endl;
	cout << max_element(aa, aa + 5)->n << endl;
	return 0;
}

其输出结果如下:

ZNludJ.png

我们注意到其min_element的输出为3。其工作流程如下,我们最开始假设3为最小值,之后进行依次遍历比较:5<3?根据我们重载的比大小表达式,显然不为真,3保持为最小值,并依次类推:7<3,etc.

而max_element的比较顺序为,假定3最大,然后比较3<5…

Reference

引用
https://www.coursera.org/learn/cpp-chengxu-sheji/lecture

相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页