什么是c++的谓词
谓词概念:
谓词函数是一个判断式,一个返回bool值的函数或者仿函数,有几个入参就是几元谓词。一般做一个函数的参数使用【引用自百度百科】。
常见的可以作为谓词的东西:函数、函数指针、函数对象、lambda表达式,库定义的函数对象。
概念消化:
谓词,即谓语动词。其实我们可能之前不了解这个概念,但是我们已经经常在使用了,最典型的例子:
使用sort算法对vector元素降序排序:
参3 greater<int>() 就是一个谓词,它本质上是c++的库函数对象。
sort(v.begin(), v.end(), greater<int>());
顺便对比回顾下 sort的算法声明:
sort(iterator beg, iterator end, _Pred); // 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置 // beg 开始迭代器 // end 结束迭代器 // _Pred 谓词
参3 _Pred ,就是谓词,predicate单词的前缀。
其实个人感觉这个名字其实起的还是挺形象的,明确表述了 谓词 在算法语句中所起的作用,让程序员能够自定义算法执行时候“更具体的的动作”。
澄清一点:
在之前的学习过程中,发现有些博文或者教程如下定义谓词。
返回bool类型的仿函数称为谓词
如果operator()接受一个参数,那么叫做一元谓词
如果operator()接受两个参数,那么叫做二元谓词
但是作为初学者在后续的使用过程中,发现需要传入谓词的地方很多时候,传入一个函数名或者函数指针、或者一个lambda表达式照样使用。因此,本文章稍微从广义角度稍微矫正了个人对谓词的理解。
STL中使用到谓词的算法快速回顾
实际使用中,能感觉到,stl常用算法中大量应用了谓词,便于程序员执行算法的时候定义“更具体的/自定义的动作”。例如:
例如:遍历算法
//普通函数
void print01(int val)
{cout << val << " ";
}
//函数对象
class print02
{public:void operator()(int val) {cout << val << " ";}
};//for_each算法基本用法
void test01() {vector<int> v;for (int i = 0; i < 10; i++) {v.push_back(i);}//遍历算法for_each(v.begin(), v.end(), print01);cout << endl;for_each(v.begin(), v.end(), print02());cout << endl;
}
例如:查找算法
//内置数据类型
class GreaterFive
{
public:bool operator()(int val){return val > 5;}
};void test01() {vector<int> v;for (int i = 0; i < 10; i++) {v.push_back(i + 1);}vector<int>::iterator it = find_if(v.begin(), v.end(), GreaterFive());if (it == v.end()) {cout << "没有找到!" << endl;}else {cout << "找到大于5的数字:" << *it << endl;}
}
例如:排序算法
sort(v.begin(), v.end(), greater<int>());
例如:拷贝替换算法
class myPrint
{
public:void operator()(int val){cout << val << " ";}
};class ReplaceGreater30
{
public:bool operator()(int val){return val >= 30;}
};void test01()
{vector<int> v;v.push_back(20);v.push_back(30);v.push_back(20);v.push_back(40);v.push_back(50);//将容器中大于等于的30 替换成 3000replace_if(v.begin(), v.end(), ReplaceGreater30(), 3000);for_each(v.begin(), v.end(), myPrint());
}
针对某种算法展开举例各种谓词的使用
已经有很多博友在这块写过总结,路过的小伙伴可以直接参考:
count_if:
c++中的谓词:函数、函数指针、函数对象(仿函数)、lambda表达式、bind2nd使用示例_c++ 定义函数做谓词-CSDN博客
sort:
C++ - 算法(algorithm) 的 谓词(predicate) 详解_predicate c++-CSDN博客