我们在日常使用和编程比赛中,经常会用到排序算法和查找算法,常用的算法包括查找和排序两类。以下这些算法都在algorithm头文件中定义的泛型操作。
查找
- find(迭代对象开始位置,迭代对象结束位置, 需要查找的对象)
- find(迭代对象开始位置,迭代对象结束位置, 谓词)
排序
- sort(迭代对象开始位置,迭代对象结束位置)默认为升序)
- sort(迭代对象开始位置,迭代对象结束位置,谓词)
谓词为可调用的对象:例如函数和lambda表达式
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool reverase(int &a, int &b){ // 用于定制化选择的函数
return a > b;
}
int main(){
vector<int> vec = {1,3,2,4};
// for_each可用于选择输出
for_each(vec.begin(), vec.end(), [](int num){
cout << num << endl;
});
// 查找算法find_if
int a = 3;
auto result = find(vec.begin(), vec.end(), 4);
auto result1 = find_if(vec.begin(), vec.end(), [a](int t){ // 中括号列表里面代表捕获的局部变量
return a == t;
});
cout << (*result)<< endl;
cout << (*result1)<< endl;
// 排序算法--定制函数--lambda表达式
sort(vec.begin(), vec.end()); // 默认按升序
sort(vec.begin(), vec.end(), reverase); // 根据谓词逻辑进行排列
sort(vec.begin(), vec.end(), [](int &a, int &b){ // lambda表达式进行排列
return a > b;
});
}
定制操作
我们使用sort的第二版本时,这个版本是重载过的,它接受的第三个参数,这个参数是一个谓词
谓词
谓词是一个可调用的表达式,其返回结果是一个能用作条件的值。标准库的谓词分为两种:
- 一元谓词:只接受单一的参数
- 二元谓词:接受两个参数
- 元素的类型必须能转换为谓词的参数
以上find_if()和sort的第二个版本有体现
lambda表达式
[可捕获局部变量] (参数列表) -> 返回值类型:通常可以省略,自动推断{
执行操作的语句块
}
捕获列表的三种方式
- 值捕获
- 引用捕获
- 隐士捕获
注意:捕获列表只用于局部非static变量,lambda可以直接使用局部static变量和在它所在函数之外声明的名字
如果局部变量不用捕获列表的话,在语句块里面直接使用会报错。
for_each
上面使用的for_each()也在算法头文件中