STL算法之谓词
2022-10-16 本文已影响0人
二进制人类
概述
返回值类型为bool的普通函数或函数对象都叫谓词。
分类
一元谓词:一个参数 一般用于查找策略
二元谓词:两个参数 一般用于排序策略
实现
一元谓词
#include <iostream>
#include <string>
#include<vector>
#include<algorithm>
using namespace std;
//函数对象作为谓词
class GreaterThan40
{
public:
bool operator()(int value){
return value>40;
}
};
//普通函数作为谓词
bool greaterThan40(int value){
return value>40;
}
int main()
{
vector<int> v;
v.push_back(30);
v.push_back(40);
v.push_back(20);
v.push_back(50);
v.push_back(10);
vector<int>::iterator ret;
ret = find_if(v.begin(),v.end(),GreaterThan40());
if(ret!=v.end()){
cout<<"第一个大于40的数:"<<*ret<<endl;//50
}
return 0;
}
二元谓词
#include <iostream>
#include <string>
#include<vector>
#include<algorithm>
using namespace std;
//普通函数作为谓词
bool myGreater(int v1, int v2)
{
return v1>v2;
}
//函数对象作为谓词
class MyGreater
{
public:
bool operator()(int v1, int v2)
{
return v1>v2;
}
};
int main()
{
vector<int> v;
v.push_back(30);
v.push_back(40);
v.push_back(20);
v.push_back(50);
v.push_back(10);
//sort(v.begin(), v.end(), myGreater);
sort(v.begin(), v.end(), MyGreater());
vector<int>::iterator it=v.begin();
for(;it!=v.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
return 0;
}
内建函数对象
//6 个算数类函数对象,除了 negate 是一元运算,其他都是二元运算。
template<class T> T plus<T>//加法仿函数
template<class T> T minus<T>//减法仿函数
template<class T> T multiplies<T>//乘法仿函数
template<class T> T divides<T>//除法仿函数
template<class T> T modulus<T>//取模仿函数
template<class T> T negate<T>//取反仿函数
//6 个关系运算类函数对象,每一种都是二元运算。
template<class T> bool equal_to<T>//等于
template<class T> bool not_equal_to<T>//不等于
template<class T> bool greater<T>//大于
template<class T> bool greater_equal<T>//大于等于
template<class T> bool less<T>//小于
template<class T> bool less_equal<T>//小于等于
//逻辑运算类运算函数,not 为一元运算,其余为二元运算。
template<class T> bool logical_and<T>//逻辑与
template<class T> bool logical_or<T>//逻辑或
template<class T> bool logical_not<T>//逻辑非
实例
void test(){
vector<int> v;
v.push_back(30);
v.push_back(40);
v.push_back(20);
v.push_back(50);
v.push_back(10);
vector<int>::iterator ret;
ret = find_if(v.begin(),v.end(),bind2nd(greater<int>(),40));
if(ret!=v.end()){
cout<<"第一个大于40的数:"<<*ret<<endl;
}
}