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

本文主要是介绍【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
请按任意键继续. . .

在这里插入图片描述

这篇关于【C++】STL 算法 ④ ( 函数对象与谓词 | 一元函数对象 | “ 谓词 “ 概念 | 一元谓词 | find_if 查找算法 | 一元谓词示例 )的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/578292

相关文章

Pandas中统计汇总可视化函数plot()的使用

《Pandas中统计汇总可视化函数plot()的使用》Pandas提供了许多强大的数据处理和分析功能,其中plot()函数就是其可视化功能的一个重要组成部分,本文主要介绍了Pandas中统计汇总可视化... 目录一、plot()函数简介二、plot()函数的基本用法三、plot()函数的参数详解四、使用pl

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

pandas中位数填充空值的实现示例

《pandas中位数填充空值的实现示例》中位数填充是一种简单而有效的方法,用于填充数据集中缺失的值,本文就来介绍一下pandas中位数填充空值的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是中位数填充?为什么选择中位数填充?示例数据结果分析完整代码总结在数据分析和机器学习过程中,处理缺失数

Pandas统计每行数据中的空值的方法示例

《Pandas统计每行数据中的空值的方法示例》处理缺失数据(NaN值)是一个非常常见的问题,本文主要介绍了Pandas统计每行数据中的空值的方法示例,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是空值?为什么要统计空值?准备工作创建示例数据统计每行空值数量进一步分析www.chinasem.cn处

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模