C++系列-谓词predicate

谓词predicate

  • 💢什么是谓词
    • 💢💢函数(function)谓词
    • 💢💢函数指针(function pointer)谓词
    • 💢💢函数对象(Function Object)谓词
    • 💢💢lambda表达式谓词
    • 💢💢库定义的函数对象谓词
  • 💢谓词的应用
  • 💢一元和二元谓词
    • 一元和二元谓词举例


赵师秀 宋《约客》
黄梅时节家家雨,青草池塘处处蛙。
有约不来过夜半,闲敲棋子落灯花


💢什么是谓词

  • 🥝谓词是一个可以调用的对象
  • 🥝它接收一个或一个或多个参数,并返回一个或布尔值
  • 🥝谓词通常用于算法中 ,以指定特定的条件,例如在排序算法中,可以用谓词指定排序的规则,在查找算法中,可以使用谓词来确定是否找到了满足特定条件的元素。

💢💢函数(function)谓词

  • 🍋函数的定义满足谓词的定义条件。
  • 🍋在使用时通过传递函数名实现 。

👉👉👉
先看find_if函数的定义,返回_First,是一个迭代器对象。
_Pred(_UFirst),_Pred是执行实参中传入的参数,在本类中,是一个函数名,函数名()是函数的调用。_UFirst是迭代器指向的内容。
在for循环中,循环从_First到_Last迭代器指向的每一个元素,将其作为函数的参数,执行函数操作,当出现返回true的时候,退出循环,即找到第一个满足条件的元素就退出。
vector::iterator it = find_if(vec1.begin(), vec1.end(), is_even)中的is_even要传递函数名称。是一个谓词。

_EXPORT_STD template <class _InIt, class _Pr>
_NODISCARD _CONSTEXPR20 _InIt find_if(_InIt _First, const _InIt _Last, _Pr _Pred) 
{ // find first satisfying _Pred_Adl_verify_range(_First, _Last);auto _UFirst      = _Get_unwrapped(_First);const auto _ULast = _Get_unwrapped(_Last);for (; _UFirst != _ULast; ++_UFirst) {if (_Pred(*_UFirst)) {break;}}_Seek_wrapped(_First, _UFirst);return _First;
}
code:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;bool is_even(int &val)
{return val % 2 == 0;
}void test01()
{vector<int> vec1{1, 2, 3, 4, 5, 6};// find_if(_InIt _First, const _InIt _Last, _Pr _Pred) { // find first satisfying _Predvector<int>::iterator it = find_if(vec1.begin(), vec1.end(), is_even);if(it == vec1.end()){cout << "没有找到" << endl;}else{cout << "第一个偶数是: " << *it << endl;}
}int main()
{test01();system("pause");return 0;
}result:
第一个偶数是: 2

💢💢函数指针(function pointer)谓词

  • 🍓使用函数指针做谓词,与上述函数做谓词基本一致,只是使用函数指针中转了一次。
  • 🍓在使用时通过传递函数指针实现 。
code:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;bool greater_than10(int &val)
{return val > 10;
}void test01()
{vector<int> vec1{1, 2, 13, 24, 5, 6};bool (*p_greater_than10)(int&); // 定义函数指针p_greater_than10 = greater_than10;vector<int>::iterator it = find_if(vec1.begin(), vec1.end(), greater_than10); // 函数指针作为谓词if(it == vec1.end()){cout << "没有找到" << endl;}else{cout << "第一个大于10的数是: " << *it << endl;}
}int main()
{test01();system("pause");return 0;
}result:
第一个大于10的数是: 13

💢💢函数对象(Function Object)谓词

  • 🍈 函数对象中重载函数的调用(), 使其可以被调用, 作为谓词。
  • 🍈 函数对象使用的本质就是对()进行运算符重载,并且返回类型为bool型,满足谓词的条件。

👉👉👉
在find_if函数中,执行 _Pred(_UFirst),_Pred是执行实参中传入的参数,在本类中,即函数对象,函数对象(_UFirst)即调用重载的()成员函数,实现了重载()函数中执行的语句。
Greater(1),创建匿名函数对象,其中的参数传入,使得在调用()时,有了明确的比较对象。

code:
#include<iostream>
#include<vector>
#include<algorithm>using namespace std;
class Greater
{
public:Greater(int val) :m_base(val) {}bool operator()(int val){return val > m_base;}
private:int m_base;
};int main()
{vector<int>vec1 = { 0,-1,1,2,4,9,5,54,45,56 };// 函数对象做谓词,并且使用有参构造传入参数作为谓词判断的条件vector<int>::iterator iter = find_if(vec1.begin(), vec1.end(), Greater(1));cout << *iter << endl;system("pause");return 0;
}result:
2

💢💢lambda表达式谓词

👉👉👉
[](int val)->bool{return val > 3;} lambda表达式作参数,这是一个匿名函数,在find_if 的_Pred(*_UFirst)中的_Pred就指向了该匿名函数。

code:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;int main()
{vector<int>vec1 = { 0,-1,1,2,4,9,5,54,45,56 };// lambda做谓词vector<int>::iterator iter = find_if(vec1.begin(), vec1.end(), [](int val)->bool{return val > 3;});cout << *iter << endl;system("pause");return 0;
}result:
4

库定义的函数对象(Library-Defined Function Object)谓词

💢💢库定义的函数对象谓词

  • 🍉 标准库中已经定义好一些用于特定条件判断的函数对象。
  • 🍉 比如less是用于比较两个对象的大小的函数对象谓词。

💢谓词的应用

  • 🍐谓词通常用于算法中,指定特定的条件。
  • 🍐 例如在排序算法中,可以使用谓词来定义排序的规则。在查找算法中,可以使用谓词来确定是否找到了满足特定条件的元素。

💢一元和二元谓词

  • 🥝一元谓词接受一个参数。
  • 🥝二元谓词接受两个个参数。

一元和二元谓词举例

code:
#include<iostream>
#include<vector>
#include<algorithm>using namespace std;
class Greater
{
public:Greater(int val) :m_base(val) {} // 重载的(), 函数可以接受一个参数,故Greater的对象是二元谓词bool operator()(int val){return val > m_base;}
private:int m_base;
};template<class T>
class MyCompare
{
public:bool operator()(T val1, T val2) // 重载的(), 函数可以接受两个参数,故MyCompare的对象是二元谓词{return val1 > val2;}
};void print_vector(vector<int> &vec)
{for (auto i_vec : vec){cout << i_vec << " ";}cout << endl;
}int main()
{vector<int>vec1 = { 0,-1,1,2,4,9,5,54,45,56 };cout << "排序前:" << endl;print_vector(vec1);// sort默认是升序排列,传递函数对象作为参数,改为降序排列sort(vec1.begin(), vec1.end(), MyCompare<int>());cout << "排序后:" << endl;print_vector(vec1);vector<int>::iterator iter = find_if(vec1.begin(), vec1.end(), Greater(1));cout << *iter << endl;system("pause");return 0;
}result:
排序前:
0 -1 1 2 4 9 5 54 45 56
排序后:
56 54 45 9 5 4 2 1 0 -1
56

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/879530.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

加密与安全_优雅存储用户密码的最佳实践

文章目录 Pre概述最佳实践避免使用MD5、SHA1等快速哈希算法加盐哈希 &#xff08;不推荐&#xff09;使用BCrypt、Argon2等慢哈希算法 (推荐)BCrypt Code1. 自动生成和嵌入盐2. 哈希结果的格式3. 代价因子 BCrypt特点 防止暴力破解1. 登录失败锁定2. 双因素认证&#xff08;2FA…

Golang | Leetcode Golang题解之第409题最长回文串

题目&#xff1a; 题解&#xff1a; func longestPalindrome(s string) int {mp : map[byte]int{}for i : 0; i < len(s); i {mp[s[i]]}res : 0for _, v : range mp {if v&1 1 {res v - 1} else {res v}}if res<len(s) {res}return res }

Python酷库之旅-第三方库Pandas(117)

目录 一、用法精讲 516、pandas.DataFrame.add_suffix方法 516-1、语法 516-2、参数 516-3、功能 516-4、返回值 516-5、说明 516-6、用法 516-6-1、数据准备 516-6-2、代码示例 516-6-3、结果输出 517、pandas.DataFrame.align方法 517-1、语法 517-2、参数 51…

Go语言基本语法

Go语言&#xff08;通常称为Golang&#xff09;是由Google开发的一种静态类型、编译型语言&#xff0c;它旨在简化系统编程、网络编程和并发编程的复杂性。 Go语言以其简洁、高效和易于理解的语法而受到开发者的喜爱。 Go语言的一些基本语法元素&#xff1a; 1. 包&#xff…

protobuf中c、c++、python使用

文章目录 protobuf实例&#xff1a;例题1&#xff1a;[CISCN 2023 初赛]StrangeTalkBot分析&#xff1a;思路&#xff1a;利用&#xff1a; 例题2&#xff1a;[CISCN 2024]protoverflow分析&#xff1a; protobuf Protocol Buffers&#xff0c;是Google公司开发的一种数据描述语…

数学学习记录

9月14日 1.映射&#xff1a; 2.函数: 9月15日 3.反函数&#xff1a; 4.收敛数列的性质 5.反三角函数&#xff1a; 9月16日 6.函数的极限&#xff1a; 7.无穷小和无穷大 极限运算法则&#xff1a;

远程Linux网络连接( Linux 网络操作系统 04)

接下来我们准备开始进入Linux操作系统的第二个模块的学习&#xff0c;不过在学习之前我们需要对如下进行简单的配置&#xff0c;通过外接辅助软件MobaXterm来进行虚拟操作系统的访问。接下来的课程我们会一直在MobaXterm中进行命令和相关知识的学习。 一、准备阶段 1.1 软件 …

学习笔记JVM篇(三)

一、垃圾回收机制 垃圾回收&#xff08;Garbage Collection&#xff09;机制&#xff0c;是自动回收无用对象从而释放内存的一种机制。Java之所以相对简单&#xff0c;很大程度是归功于垃圾回收机制。&#xff08;例如C语言申请内存后要手动的释放&#xff09; 优点&#xff…

数据清洗-缺失值填充-K-NN算法(K-Nearest Neighbors, K-NN算法)

目录 一、安装所需的python包二、采用K-NN算法进行缺失值填充2.1可直接运行代码2.2以某个缺失值数据进行实战2.2.1代码运行过程截屏&#xff1a;2.2.2填充后的数据截屏&#xff1a; 三、K 近邻算法 (K-Nearest Neighbors, KNN) 介绍3.1 K 近邻算法定义3.2 K 近邻算法的基本思想…

福建科立讯通信 指挥调度管理平台 SQL注入漏洞

北峰通信-福建科立讯通信 指挥调度管理平台 SQL注入漏洞 厂商域名和信息收集 域名&#xff1a; 工具sqlmap python sqlmap.py -u "http://ip:端口/api/client/down_file.php?uuid1" --batch 数据包 GET /api/client/down_file.php?uuid1%27%20AND%20(SELECT%20…

替换 Oracle ,江河信息用 TDengine 解决高基数查询写入问题

在数字经济快速发展的背景下&#xff0c;智慧水利作为重要的基础设施之一&#xff0c;正逐步成为提升水资源管理效率、优化生态环境的重要力量。江西省水投江河信息技术有限公司&#xff08;以下简称“江河信息”&#xff09;作为高新技术国有企业&#xff0c;坚定致力于打造数…

Leetcode 每日一题:Longest Increasing Path in a Matrix

写在前面&#xff1a; 今天我们继续看一道 图论和遍历 相关的题目。这道题目的背景是在一个矩阵当中找寻最长的递增数列长度。思路上非常好想&#xff0c;绝对和 DFS 相关&#xff0c;但是题目的优化要求非常高&#xff0c;对于语言和内存特性的考察特别丰富&#xff0c;如果是…

15. Springboot集成Redis

目录 1、前言 2、为什么选择Spring Boot集成Redis&#xff1f; 3、快速上手 3.1、引入依赖 3.2、 配置连接信息 3.3、自定义配置类 4、RedisTemplate的使用 4.1、String类型操作 4.2、 Hash类型操作 4.3、List类型操作 4.4、Set类型操作 4.5、SortedSet类型操作 4…

第十一章 【后端】商品分类管理微服务(11.2)——Lombok

11.2 Lombok 官网:https://projectlombok.org/ 较新版本的 idea 已默认安装 lombok 插件 Lombok 工具提供一系列的注解,使用这些注解可以不用定义 getter、setter、equals、constructor 等,可以消除 java 代码的臃肿,编译时它会在字节码文件中自动生成这些通用的方法,简…

ElK 8 收集 Nginx 日志

1. 说明 elk 版本&#xff1a;8.15.0 2. 启个 nginx 有 nginx 可以直接使用。我这里是在之前环境下 docker-compose.yml 中启动了个 nginx&#xff1a; nginx:restart: alwaysimage: nginx:1.26.1ports:- "80:80"- "443:443"volumes:#- ./nginx/html:/…

【题解】—— LeetCode一周小结37

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结36 9.合并零之间的节点 题目链接&#xff1a;2181. 合并零之间…

Unity实战案例全解析:PVZ 植物放置分析

前篇&#xff1a;Unity实战案例全解析&#xff1a;PVZ 植物卡片状态分析-CSDN博客 植物应该如何从卡牌状态转为实物&#xff1f; 其实就只需要考虑两个步骤加一个后续处理&#xff1a; 1.点击卡牌后就实例化 需要一个植物状态枚举&#xff0c;因为卡牌分为拿在手上和种植下…

CS61C 2020计算机组成原理Lecture01-数字表示,溢出

1. 原码 原码就是符号化的数值&#xff0c;其编码规则简单直观&#xff1a;正数符号位用0表示&#xff0c;负数符号位用1表示&#xff0c;数值位保持不变。 x0.1101&#xff0c;则[x]原0.1101&#xff1b;x1101&#xff0c;则[x]原01101x -0.1111&#xff0c;则[x]原1.1111&…

Oracle从入门到放弃

Oracle从入门到放弃 左连接和右连接Where子查询单行子查询多行子查询 from子句的子查询select子句的子查询oracle分页序列序列的应用 索引PL/SQL变量声明与赋值select into 赋值变量属性类型 异常循环游标存储函数存储过程不带传出参数的存储过程带传出参数的存储过程 左连接和…

opencv之Canny边缘检测

文章目录 前言1.应用高斯滤波去除图像噪声2.计算梯度3.非极大值抑制4.应用双阈值确定边缘5.Canny函数及使用 前言 Canny边缘检测是一种流行的边缘检测算法&#xff0c;用于检测图像中的边缘。它通过一系列步骤将图像中的像素边缘突出显示出来&#xff0c;主要分为以下几个步骤…