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 }

搭建VUE前端项目流程——Node.js 、Yarn、npm、Vue、Vite、Webpack

文章目录 搭建VUE前端项目流程Vue、Vite、Webpack、Yarn、Node.js 和 npm 的概念解释&#xff0c;以及它们之间的关系&#xff1a;搭建项目流程 搭建VUE前端项目流程 Vue、Vite、Webpack、Yarn、Node.js 和 npm 的概念解释&#xff0c;以及它们之间的关系&#xff1a; Node.js…

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…

12. DataLoader的基本使用

DataLoader的基本使用 1. 为什么要使用DataLoader DataLoader对创建好的DataSet的样本取样进行了集成操作,非常方便对于后续网络训练、测试的数据集的选择和使用 DataLoader可以集成了数据批量加载的方法,可以使用 batch_size 设置批量大小,DataLoader就会自动处理批量数据…

adb install失败: INSTALL_PARSE_FAILED_NO_CERTIFICATES

这个错误表明在尝试安装 APK 文件时出现了问题&#xff0c;原因是 APK 文件中的 AndroidManifest.xml 没有签名证书。在 Android 系统中&#xff0c;所有的应用都必须经过签名才能安装到设备上。以下是解决此问题的方法&#xff1a; 方法一&#xff1a;使用 Android Studio 或命…

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公司开发的一种数据描述语…

python提取pdf表格到excel:拆分、提取、合并

本文介绍使用python提取pdf中的表格到excel中,包含pdf的拆分、pdf提取到excel、合并excel。 一、拆分pdf 将一个大的pdf按页数拆分为多个小的pdf: # pip install PyPDF2import os, pdfplumber, PyPDF2# 分割pdf def split_pdf(input_pdf_path, num_splits):# Create a PDF…

数学学习记录

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

MySQL里面的日期字符串如何转成日期做比较运算,获取两个日期之间的所有日期(包括起始日期)

SELECTSUM( current_in_amt ) AS total_in_amt FROMt_ads_spare_store_in_contrast WHERESTR_TO_DATE( etl_date, %Y-%m-%d ) > STR_TO_DATE( 2024-01-01, %Y-%m-%d ) AND STR_TO_DATE( etl_date, %Y-%m-%d ) < STR_TO_DATE( 2024-01-04, %Y-%m-%d ); 比如日期格式是 …

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

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

第R3周:LSTM-火灾温度预测:3. nn.LSTM() 函数详解

nn.LSTM 是 PyTorch 中用于创建长短期记忆&#xff08;Long Short-Term Memory&#xff0c;LSTM&#xff09;模型的类。LSTM 是一种循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;的变体&#xff0c;用于处理序列数据&#xff0c;能够有效地捕捉…

骑砍2霸主MOD开发(26)-使用TrfExporterBlender制作TRF文件

一.Blender导入TRF文件 import bpytrf_meshes = []trf_contents = []trf_import_path = D:\pt_ladder.trftrf_export_path = D:\pt_ladder_morph_keys.trfclass TrfMesh:def __init__(self):self.mesh_name = self.mesh_materials = []self.vertex_cnt = 0self.vertex_fvf_cnt…

2848. 与车相交的点(24.9.19)

祝各位中秋节快乐&#xff01; 题目 问题描述&#xff1a; 给你一个下标从 0 开始的二维整数数组 nums 表示汽车停放在数轴上的坐标。对于任意下标 i&#xff0c;nums [i] [start_i, end_i]&#xff1a;其中 start_i 是第 i 辆车的起点&#xff0c;end_i 是第 i 辆车的终点。…

学习笔记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;如果是…