【C++】STL 算法 ④ ( 函数对象与谓词 | 一元函数对象 | “ 谓词 “ 概念 | 一元谓词 | find_if 查找算法 | 一元谓词示例 )

文章目录

  • 一、函数对象与谓词
    • 1、一元函数对象
    • 2、" 谓词 " 概念
    • 3、find_if 查找算法
  • 二、一元谓词示例
    • 1、代码示例 - 一元谓词示例
    • 2、执行结果





一、函数对象与谓词



1、一元函数对象


" 函数对象 " 是通过 重载 函数调用操作符 () 实现的 operator() , 函数对象 可以 像普通函数一样被调用 , 但同时它们 还可以拥有状态并且可以有多个成员函数 ;

" 一元函数对象 " 是 函数对象 的一种 , 只 接受一个参数 并返回某个结果的 函数对象 称为 " 一元函数对象 " ;

" 一元函数对象 " 在 标准模板库 ( STL , Standard Template Library ) 中特别常见 , 尤其是在 STL 算法中 , 因为它们可以用作自定义操作 , 以适应各种不同的需求 ;
例如 : 使用 一元函数对象 来定义一个操作 , 该操作将被应用于容器中的每个元素 ;


在上一篇博客 【C++】STL 算法 ③ ( 函数对象中存储状态 | 函数对象作为参数传递时值传递问题 | for_each 算法的 函数对象 参数是值传递 ) 中的代码示例中的 PrintT 函数对象 , 其 重载的 函数调用操作符 函数 void operator()(T& t) 只接收一个参数 , 这是一个 一元函数对象 ;

//函数对象 类重载了()
template <typename T>
class PrintT {
public:void operator()(T& t) {cout << n << " . " << t << endl;// 每调用一次, 自增 1n++;}private:// 每调用一次, 该成员自增 1// 该状态一直存储int n = 0;
};

2、" 谓词 " 概念


" 谓词 ( Predicate ) " 是 C++ 语言中的 标准模板库 ( STL , Standard Template Library ) 算法的 重要概念 ;

" 谓词 ( Predicate ) " 是一个 返回 布尔 bool 类型值 的 函数对象 / 仿函数 或 Lambda 表达式 / 普通函数 , 可用于对某个条件进行检查 ;

当 " 谓词 ( Predicate ) " 被用于算法中时 , 会对序列中的元素进行某种测试 , 返回一个布尔类型的测试结果 , 根据不同的结果执行不同的操作 ;

" 谓词 ( Predicate ) " 类型 :

  • 普通函数
  • 函数指针
  • 重载了 函数调用操作符 的 函数对象 / 仿函数 , 有 operator() 函数 ;

" 谓词 ( Predicate ) " 通常被设计成可以接受一定数量的参数

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

谓词的 函数体 中 根据 传入的 参数 进行计算 , 并返回 true 或 false 布尔值 ;


3、find_if 查找算法


std::find_if 算法 是 C++ 语言的 标准模板库 中提供的一种算法 , 该算法 用于 在 容器 中查找满足特定条件的第一个元素 ;


find_if 算法 的原理是 : 执行该算法时 , 遍历容器序列 , 对每个元素应用指定的 一元谓词 ;

  • 如果 找到满足 一元谓词 返回 true 的元素 , 则返回 指向该元素的迭代器 ;
  • 如果 没有找到满足 一元谓词 返回 true 的元素 , 则返回 结束迭代器 ;

std::find_if 算法的函数原型如下 :

// FUNCTION TEMPLATE find_if
template <class _InIt, class _Pr>
_NODISCARD _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;
}




二、一元谓词示例



下面的代码示例中 , 定义了 一元谓词 :

template <typename T>
class equalFour {
public:bool operator()(T& t) {if (t == 4) {return true;}else {return false;}}
};

该 一元谓词 的 作用是 , 接收一个 T 类型的元素 , 判断该元素的值是否为 4 , 如果是 , 则返回 true , 如果不是 , 则返回 false ;

将该 一元谓词 , 传入到 find_if 算法函数中 ;


执行该算法时 , 遍历容器序列 , 对每个元素应用指定的 一元谓词 , 这里会查找满足 值等于 4 的元素 ;

  • 如果找到满足 一元谓词 返回 true 的元素 , 则返回 指向该元素的迭代器 ;
  • 如果没有找到满足 一元谓词 返回 true 的元素 , 则返回 结束迭代器 ;

1、代码示例 - 一元谓词示例


#include "iostream"
using namespace std;
#include <vector>
#include <algorithm>
#include "functional"//函数对象 类重载了()
template <typename T>
class equalFour {
public:bool operator()(T& t) {if (t == 4) {return true;}else {return false;}}
};int main() {// 创建一个 vector 单端数组容器vector<int> vec;// 向容器中插入元素vec.push_back(1);vec.push_back(2);vec.push_back(3);vec.push_back(4);vec.push_back(5);// 查找等于 4 的元素auto it = find_if(vec.begin(), vec.end(), equalFour<int>());if (it != vec.end()){cout << "找到了第一个等于 4 的数 : " << *it << endl;}// 控制台暂停 , 按任意键继续向后执行system("pause");return 0;
};

2、执行结果


执行结果 :

找到了第一个等于 4 的数 : 4
请按任意键继续. . .

在这里插入图片描述

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

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

相关文章

pythonMatplotlib六:Matplotlib的图例和注释功能

1.添加图例&#xff1a; import matplotlib.pyplot as plt# 准备数据 x [1, 2, 3, 4, 5] y1 [2, 4, 6, 8, 10] y2 [1, 3, 5, 7, 9]# 创建折线图并设置标签 plt.plot(x, y1, labelLine 1) plt.plot(x, y2, labelLine 2)# 添加图例 plt.legend()# 添加标题和标签 plt.title(&…

【数值分析】非线性方程求根,牛顿法,牛顿下山法,matlab实现

4. 牛顿法 收敛时牛顿法的收敛速度是二阶的&#xff0c;不低于二阶。如果函数有重根&#xff0c;牛顿法一般不是二阶收敛的。 x k 1 x k − f ( x k ) f ′ ( x k ) x_{k1}x_k- \frac{f(x_k)}{f(x_k)} xk1​xk​−f′(xk​)f(xk​)​ matlab实现 %% 牛顿迭代例子 f (x) x…

华为交换机常用命令

华为交换机常用命令 查看系统状态和基本信息&#xff1a; display version&#xff1a;显示设备版本信息 display device&#xff1a;显示设备硬件信息 display interface brief&#xff1a;显示接口的基本状态 display ip interface brief&#xff1a;显示IP接口的基本状态 …

创建Qt项目

项目工程名称一般不要有特殊符号&#xff0c;不要有中文 项目工程保存路径可修改的&#xff0c;但路径不要带中文 构建系统&#xff0c;有3种&#xff0c;这里使用qmake qmake和cmake区别 构建过程不同&#xff0c;项目管理不同。 1、构建过程&#xff0c;qmake是Qt框架自带的…

MySQL数据库:索引

目录 一. 索引的价值 二. 数据库与磁盘的IO 2.1 磁盘的结构 2.2 磁盘访问 2.3 MySQL与磁盘的交互 三. 对索引的理解 3.1 Page的结构 3.2 B树和B树索引结构 3.2.1 B树的结构 3.2.2 B树 3.3 聚簇索引和非聚簇索引 四. 索引的操作 4.1 索引的创建 4.2 索引的查看 4.…

new FormData 同时发送表单 json 以及文件二进制流

需要新增时同时发送表单 json 以及对应的文件即可使用以下方法传参 let formDataParams new FormData(); 首先通过 new FormData&#xff08;&#xff09; 创建你需要最后发送的表单 接着将你的对象 json 存储&#xff0c;注意使用 new Blob 创建大表单转换成 json 格式。以…

解决:TypeError: ‘tuple’ object does not support item assignment

解决&#xff1a;TypeError: ‘tuple’ object does not support item assignment 文章目录 解决&#xff1a;TypeError: tuple object does not support item assignment背景报错问题报错翻译报错位置代码报错原因解决方法方法一&#xff1a;方法二&#xff1a;今天的分享就到…

【Flink精讲】Flink数据延迟处理

面试题&#xff1a;Flink数据延迟怎么处理&#xff1f; 将迟到数据直接丢弃【默认方案】将迟到数据收集起来另外处理&#xff08;旁路输出&#xff09;重新激活已经关闭的窗口并重新计算以修正结果&#xff08;Lateness&#xff09; Flink数据延迟处理方案 用一个案例说明三…

Vue+JavaSpingBoot笔记(1)

一、前后端通信参数问题 1.集合【字典】类型 Vue前端传递参数: export default {methods: { test(){// 将 filteredData 中的每一行值放入 newData 对象数组中 const newData filteredData.map(item > ({key1: item.Value1,key2: item.Value2,key3: "测试"}));r…

Rasa中的tracker_store和event_broker

Rasa 中的 tracker_store 相对主流为 Redis&#xff0c;event_broker 相对主流为 RabbitMQ。后续为了研究学习直接将 tracker_store 和 event_broker 的 type 都设置为 SQL&#xff0c;使用 MySQL 统一管理。 一.Rasa 中的 tracker_store 要使用 MySQL 作为 Rasa 的 tracker_s…

开源许可证

文章目录 一、简介二、详细信息参考 一、简介 开源是指公开源代码&#xff0c;但这并不代表就是免费的。 开源许可证是一种法律许可。 通过它&#xff0c;版权拥有人明确允许&#xff0c;用户可以免费地使用、修改、共享版权软件。 版权法默认禁止共享&#xff0c;也就是说&am…

忘记密码mysql 8.2重置root密码|macos+linux

重置密码 2024年1月6日验证 1.找到support-files下的服务 # 查找mysql位置 which mysql #/usr/local/bin/mysql# 查找原始位置 ls -al /usr/local/bin | grep mysql# 进入原始的为值找到support-files文件夹 # 注意路径要全,我这里是macos系统就是Cellar下 cd /usr/local/Cell…

如何选择消息队列?Kafka 与 RabbitMQ

在上一期中&#xff0c;我们讨论了使用消息队列的好处。然后&#xff0c;我们回顾了消息队列产品的历史。现在看来&#xff0c;当我们需要在项目中使用消息队列时&#xff0c;Kafka 是首选产品。但是&#xff0c;当我们考虑特定要求时&#xff0c;它并不总是最佳选择。 数据库…

【Kubernetes】认证授权RBAC (一)

认证授权RBAC 一、k8s安全管理&#xff1a;认证、授权、准入控制概述1.1、简介【1】认证基本介绍【2】授权基本介绍【3】准入控制基本介绍 1.2、认证【1】客户端认证【2】Bearertoken【3】Serviceaccount【4】拓展&#xff1a;kubeconfig文件 1.3、授权【1】什么是RBAC&#xf…

rust 注释文档生成 cargo doc

rust的cargo文档生成 只需要在每个函数写清楚注释&#xff0c;就可以自动生成文档&#xff0c;很方便 即不用写文档&#xff0c;又可以快速查看&#xff0c;是开发rust的必备技能 rust安装和开发环境配置&#xff0c;可以参考&#xff1a;链接 1.写注释的方法 连续三个 \ 即…

uniapp---安卓真机调试提示检测不到手机【解决办法】

最近在做APP&#xff0c;由于华为手机更新过系统&#xff0c;再次用来调试APP发现就不行了。下面给出具体的解决方法&#xff1a; 第一步&#xff1a;打开【允许开发人员选项】 找到【设置】点击【关于手机】找到【版本号】点击7次或多次&#xff0c;允许开发人员选项。 第二…

首次引入大模型!Bert-vits2-Extra中文特化版40秒素材复刻巫师3叶奈法

Bert-vits2项目又更新了&#xff0c;更新了一个新的分支&#xff1a;中文特化&#xff0c;所谓中文特化&#xff0c;即针对中文音色的特殊优化版本&#xff0c;纯中文底模效果百尺竿头更进一步&#xff0c;同时首次引入了大模型&#xff0c;使用国产IDEA-CCNL/Erlangshen-Megat…

Python中的@abstractmethod

abstractmethod 是 Python 中 abc 模块&#xff08;Abstract Base Classes&#xff09;提供的一个装饰器&#xff0c;用于声明抽象方法。抽象方法是指在抽象类中声明但没有提供具体实现的方法&#xff0c;而是由其子类提供具体实现。 使用 abstractmethod 装饰器可以使得子类在…

职业分析与计算机方向的选择、发展

文章目录 职业分析与计算机方向的选择、发展一&#xff1a;编程学习解读与职业分析1.编程的学习阶段&#xff1a;&#xff08;1&#xff09;入门阶段&#xff08;2&#xff09;熟悉阶段&#xff08;3&#xff09;学到什么程度才叫精通呢&#xff1f; 2.职业分析&#xff08;1&a…

sqoop(DataX)-MySQL导入HIVE时间格问题

这里写自定义目录标题 问题1&#xff1a;测试MySQL 数据信息HIVE数据信息hive中用 parquet&#xff08;orc&#xff09; 列式文件格式存储 解决方法问题2&#xff1a;解决方法 问题1&#xff1a; 用公司的大数据平台&#xff08;DataX&#xff09;导数&#xff0c;已经开发上线…