目录
1、函数对象
2、谓词
2.1、一元谓词(谓词有一个参数)
2.1.1、普通函数提供策略
2.1.2、仿函数(上面的函数调用)提供策略
2.1.3、一元谓词全部代码
2.1、二元谓词(谓词有两个参数)
编辑
3、内建函数对象
重载了函数调用运算符()的类 实例化的对象 就叫做函数对象
函数对象+ ()触发 重载函数调用运算符 执行 ==》类似函数调用 (仿函数)
#include
using namespace std;
class Print
{
public:
void operator()(char *str)
{
cout<
如果一个函数对象有两个参数叫做 二元函数对象
若果一个函数对象有三个参数叫做 多元函数对象
返回值类型 为 bool 类型的 普通函数或者 仿函数都叫做 谓词
如果谓词有一个参数 叫做一元谓词,但是一元谓词用于查找元素
如果参数有两个参数 叫做二元谓词,但是二元谓词用于容器中元素排序
用于查找容器中的元素
bool greaterThan30(int value)
{
return value>30;
}
//普通函数提供策略 函数名
ret = find_if(v1.begin(), v1.end(), greaterThan30);
greaterThan30函数参数为int类型,是因为底层中find_if函数的第三个参数是greaterThan30(参数为int类型)的入口地址,find_if将迭代器中的每一个元素都送到 greaterThan30(参数为int类型)函数进行比较,所以必然greaterThan30(参数为int类型)函数的参数为int 类型
class GreaterThan30
{
public:
bool operator()(int value) //find_if将迭代器中的每一个元素放入该成员函数中比较
{
return value>30;
}
};
//仿函数提供策略 类名称+()
ret = find_if(v1.begin(), v1.end(), GreaterThan30());
//谓词的演示
#include
#include
bool greaterThan30(int value)
{
return value>30;
}
class GreaterThan30
{
public:
bool operator()(int value)
{
return value>30;
}
};
void test02()
{
vector v1;
v1.push_back(10);
v1.push_back(30);
v1.push_back(50);
v1.push_back(70);
v1.push_back(90);
//find_if条件查找, 来自算法头文件 #include
vector::iterator ret;
//普通函数提供策略 函数名
//ret = find_if(v1.begin(), v1.end(), greaterThan30);
//仿函数提供策略 类名称+()
ret = find_if(v1.begin(), v1.end(), GreaterThan30());
if(ret != v1.end())
{
cout<<"寻找的结果:"<<*ret<
函数参数传递规律和一元谓词一样,用于容器中元素排序——算法排序
//二元谓词的演示
#include
#include
void printVectorAll(vector &v)
{
vector::iterator it;
for(it=v.begin(); it!=v.end(); it++)
{
cout<<*it<<" ";
}
cout<v2;
}
class MyGreaterInt1
{
public:
bool operator()(int v1, int v2)
{
return v1>v2;
}
};
void test03()
{
vector v1;
v1.push_back(10);
v1.push_back(50);
v1.push_back(30);
v1.push_back(90);
v1.push_back(70);
cout<<"原始数据:";
printVectorAll(v1);
sort(v1.begin(), v1.end()); //默认排序方法是从小到大
cout<<"\n"<<"使用 sort 的默认排序规则:";
printVectorAll(v1);
sort(v1.begin(), v1.end(), myGreaterInt);
cout<<"\n"<<"使用全局普通函数,修改 sort 的默认排序规则:";
printVectorAll(v1);
sort(v1.begin(), v1.end(),MyGreaterInt1());
cout<<"\n"<<"使用仿函数,修改 sort 的默认排序规则:";
printVectorAll(v1);
sort(v1.begin(), v1.end(), greater() ); //sort支持随机访问的容器,而 list 不是随机访问的容器,所以它是自己提供排序算法,而不使用 #include中的sor排序算法
cout<<"\n"<<" 使用算法库提供的方法,修改 sort 的默认排序规则:";
printVectorAll(v1);
}
int main(int argc, char *argv[])
{
test03();
return 0;
}
//使用内建函数对象演示
#include
#include
void test03()
{
vector v1;
v1.push_back(10);
v1.push_back(50);
v1.push_back(30);
v1.push_back(90);
v1.push_back(70);
cout<<"原始数据:";
printVectorAll(v1);
sort(v1.begin(), v1.end(), greater() ); //sort支持随机访问的容器,而 list 不是随机访问的容器,所以它是自己提供排序算法,而不使用 #include中的sor排序算法
cout<<"\n"<<"使用内建函数对象,修改 sort 的默认排序规则:";
printVectorAll(v1);
}
int main(int argc, char *argv[])
{
test03();
return 0;
}
使用适配器将两个参数绑定为一个参数,使 find_if 函数不能出错,方便程序查询正确的结果,因为 find_if 本身是三个参数,你要传递四个参数,所以只能使用适配器
void test04()
{
vector v1;
v1.push_back(10);
v1.push_back(30);
v1.push_back(50);
v1.push_back(70);
v1.push_back(90);
//find_if条件查找
vector::iterator ret;
ret = find_if(v1.begin(), v1.end(), bind2nd(greater(), 30) ); //使用适配器将两个参数绑定为一个参数,使 find_if 函数不能出错,方便程序查询正确的结果,因为 find_if 本身是三个参数,你要传递四个参数,所以只能使用适配器
if(ret != v1.end())
{
cout<<"寻找的结果:"<<*ret<