谓词是指普通函数或重载的operator()返回值是bool类型的函数对象(仿函数)。如果operator接受一个参数,那么叫做一元谓词,如果接受两个参数,那么叫做二元谓词,谓词可作为一个判断式。
一元谓词
class num_1{ //伪函数
public:
bool operator()(int val) //重载
{
return val > 3;
}
};
int main(void)
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
// num_1 p1;
// 返回值是迭代器
// find_if(v1.begin(), v1.end(), num_1()); //匿名对象写法
// find_if(v1.begin(), v1.end(), p1);
vector<int>::iterator a = find_if(v.begin(), v.end(), num_1()); // 匿名对象写法
if(a != v.end())
{
cout << "找到了大于3的元素:" << *a << endl;
}
else
{
cout << "没有找到" << endl;
}
我在代码使用了一元谓词,即重载了()运算符的自定义类num_1作为find_if函数的参数。这个一元谓词返回一个bool值,判断输入的值是否大于3。通过调用find_if函数,在vector容器中查找第一个满足该条件的元素。如果找到了,就输出该元素的值;如果没有找到,就输出"没有找到"。
二元谓词
class num_2{ //二元谓词
public:
bool operator()(int a1,int a2)
{
return a1 > a2;
}
};
void num_1(int a) //打印回调函数
{
cout << a << " ";
}
int main(void)
{
vector<int> v;
v.push_back(1);
v.push_back(9);
v.push_back(5);
v.push_back(10);
v.push_back(5);
// //二元谓词
// sort(v.begin(), v.end());
sort(v.begin(), v.end(), num_2()); //匿名对象写法
for_each(v.begin(), v.end(), num_1); //不写小括号的方法就叫回调函数
for_each(v.begin(), v.end(), [](int a){ cout << a << " "; }); //写法二lambda表达式
我在代码中使用了一个二元谓词来对vector容器中的元素进行排序。二元谓词是一个类,其中重载了一个()运算符,该运算符接受两个参数并返回一个bool值。在本例中,二元谓词的功能是判断第一个参数是否大于第二个参数。
在main函数中,通过sort函数对vector容器v进行排序,第三个参数传入了一个匿名对象num_2(),表示使用该二元谓词对元素进行排序。
接下来使用for_each函数对排序后的vector容器进行遍历,其中第二个参数传入了一个函数指针num_1,表示使用该函数作为回调函数来处理每个元素。回调函数的功能是打印每个元素。
我在代码还展示了一种使用lambda表达式作为回调函数的写法。lambda表达式是一种匿名函数的写法,用于简化函数的定义和使用。在本例中,lambda表达式内部定义了一个匿名函数,功能与num_1函数相同,即打印元素。通过在for_each函数中直接使用lambda表达式作为回调函数,可以简化代码的书写。