谓词
定义
谓词是指普通函数或重载的operator()的仿函数 返回值是bool类型。
使用方式
//一元谓词
class GreaterThan20
{
public:
bool operator()(int val)//因为整个仿函数的返回值是bool类型,而且参数是一个,所以被称为一元谓词。
{
return val> 20;
}
};
int main()
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
vector<int>::iterator ret = find_if(v.begin(), v.end(), GreaterThan20());//返回值是迭代器
//按条件查找,先将范围划分,然后再提供一个仿函数/回调函数,注意放进来的应该是对象而不是函数类型
if (ret != v.end())
{
cout << "找到了大于20的数字" << *ret << endl;
}
else
{
cout << "未找到" << endl;
}
return 0;
}
//二元谓词
void myPrintInt(int val)//回调函数
{
cout << val << " ";
}
class myCompare//仿函数
{
public:
bool operator()(int v1, int v2)//这个就是二元谓词
{
return v1 > v2;
}
};
int main()
{
vector<int> v;
v.push_back(10);
v.push_back(30);
v.push_back(20);
v.push_back(40);
sort(v.begin(), v.end());//默认从小到大
//如果想从大到小
sort(v.begin(), v.end(), myCompare());//这里传入的不是函数名,而是函数(匿名)对象。
for_each(v.begin(), v.end(), myPrintInt);//另一种遍历的方法(底层函数实现),将范围中的所有元素都一次带入后面的回调函数的主题中实现。
return 0;
}
拓展:介绍一下lambda表达式
void myPrintInt(int val)//回调函数
{
cout << val << " ";
}
class myCompare//仿函数
{
public:
bool operator()(int v1, int v2)
{
return v1 > v2;
}
};
int main()
{
vector<int> v;
v.push_back(10);
v.push_back(30);
v.push_back(20);
v.push_back(40);
sort(v.begin(), v.end(), myCompare());
//for_each(v.begin(), v.end(), myPrintInt);//另一种遍历的方法(底层函数实现),将范围中的所有元素都一次带入后面的回调函数的主题中实现。
//使用lambda表达式来遍历,匿名函数,[]是lamda是标志。
for_each(v.begin(), v.end(), [](int val) {cout << val << " "; });//代替上面的myCompare,只有实现体,内有函数名。
return 0;
}