C++STL算法库中谓词的使用

什么是c++的谓词

谓词概念:

        谓词函数是一个判断式,一个返回bool值的函数或者仿函数,有几个入参就是几元谓词。一般做一个函数的参数使用【引用自百度百科】。

        常见的可以作为谓词的东西:函数、函数指针、函数对象、lambda表达式,库定义的函数对象。

概念消化:

        谓词,即谓语动词。其实我们可能之前不了解这个概念,但是我们已经经常在使用了,最典型的例子:

使用sort算法对vector元素降序排序:

      参3 greater<int>() 就是一个谓词,它本质上是c++的库函数对象。

sort(v.begin(), v.end(), greater<int>());

 顺便对比回顾下 sort的算法声明:

sort(iterator beg, iterator end, _Pred);
// 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
//  beg    开始迭代器
//  end    结束迭代器
// _Pred  谓词

      参3 _Pred ,就是谓词,predicate单词的前缀。

        其实个人感觉这个名字其实起的还是挺形象的,明确表述了 谓词 在算法语句中所起的作用,让程序员能够自定义算法执行时候“更具体的的动作”。

澄清一点:

        在之前的学习过程中,发现有些博文或者教程如下定义谓词。

  • 返回bool类型的仿函数称为谓词

  • 如果operator()接受一个参数,那么叫做一元谓词

  • 如果operator()接受两个参数,那么叫做二元谓词

        但是作为初学者在后续的使用过程中,发现需要传入谓词的地方很多时候,传入一个函数名或者函数指针、或者一个lambda表达式照样使用。因此,本文章稍微从广义角度稍微矫正了个人对谓词的理解。

STL中使用到谓词的算法快速回顾

        实际使用中,能感觉到,stl常用算法中大量应用了谓词,便于程序员执行算法的时候定义“更具体的/自定义的动作”。例如:

例如:遍历算法

//普通函数
void print01(int val) 
{cout << val << " ";
}
//函数对象
class print02 
{public:void operator()(int val) {cout << val << " ";}
};//for_each算法基本用法
void test01() {vector<int> v;for (int i = 0; i < 10; i++) {v.push_back(i);}//遍历算法for_each(v.begin(), v.end(), print01);cout << endl;for_each(v.begin(), v.end(), print02());cout << endl;
}

例如:查找算法

//内置数据类型
class GreaterFive
{
public:bool operator()(int val){return val > 5;}
};void test01() {vector<int> v;for (int i = 0; i < 10; i++) {v.push_back(i + 1);}vector<int>::iterator it = find_if(v.begin(), v.end(), GreaterFive());if (it == v.end()) {cout << "没有找到!" << endl;}else {cout << "找到大于5的数字:" << *it << endl;}
}

例如:排序算法

sort(v.begin(), v.end(), greater<int>());

例如:拷贝替换算法

class myPrint
{
public:void operator()(int val){cout << val << " ";}
};class ReplaceGreater30
{
public:bool operator()(int val){return val >= 30;}
};void test01()
{vector<int> v;v.push_back(20);v.push_back(30);v.push_back(20);v.push_back(40);v.push_back(50);//将容器中大于等于的30 替换成 3000replace_if(v.begin(), v.end(), ReplaceGreater30(), 3000);for_each(v.begin(), v.end(), myPrint());
}

针对某种算法展开举例各种谓词的使用

已经有很多博友在这块写过总结,路过的小伙伴可以直接参考:

count_if:

c++中的谓词:函数、函数指针、函数对象(仿函数)、lambda表达式、bind2nd使用示例_c++ 定义函数做谓词-CSDN博客

sort:

C++ - 算法(algorithm) 的 谓词(predicate) 详解_predicate c++-CSDN博客

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

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

相关文章

gprMax安装步骤

本来是想直接在base环境下直接弄的&#xff0c;但是报错了&#xff0c;因为base环境里的conda版本不匹配&#xff0c;于是重新建立虚拟环境gprMax&#xff0c;如下所示。 然后激活建立的gprMax环境&#xff0c;在gprMax环境中安装git 参考文章&#xff1a; https://zhuanlan.…

Unity_ET框架项目-斗地主_启动运行流程

unity_ET框架项目-斗地主_启动运行流程 项目源码地址&#xff1a; Viagi/LandlordsCore: ET斗地主Demohttps://github.com/Viagi/LandlordsCore下载项目到本地。 启动运行步骤&#xff1a; 下载目录如下&#xff1a; 1. VS&#xff08;我用是2022版VisualStudio&#xff09…

小小的日志,大大的坑 | 京东云技术团队

1. 背景 压测过程中优化线程池以后单机qps存在性能瓶颈&#xff0c;优化过程中发现默认线程池及日志对性能存在严重的影响所以引发了一系列对日志优化的整理 2.哪些场景可能导致性能问题 在任何系统中&#xff0c;日志都是非常重要的组成部分&#xff0c;它是反映系统运行情…

pip指定优先从豆瓣源下载包

对于 Unix/macOS 系统&#xff0c;使用以下命令&#xff1a; pip config set global.index-url https://pypi.douban.com/simple/ 对于 Windows 系统&#xff0c;打开命令提示符或PowerShell&#xff0c;并使用相同的命令&#xff1a; pip config set global.index-url http…

部署Nextcloud详细步骤及优化方法

一、安装PHP8.0以上 我这里使用PHP8.0.30 [rootlocalhost ~]# php -v PHP 8.0.30 (cli) (built: Aug 3 2023 17:13:08) ( NTS gcc x86_64 ) Copyright (c) The PHP Group Zend Engine v4.0.30, Copyright (c) Zend Technologies [rootlocalhost ~]# 安装方法参考 二、安装MY…

如何设计接口公共返回码:让你的API“说话”更地道!

在构建RESTful API时&#xff0c;设计一套清晰、一致且易于理解的公共返回码体系是至关重要的。它不仅能够让前端开发者快速理解后端的响应状态&#xff0c;还能够提升整个系统的健壮性和可维护性。本文将深入探讨如何设计一个优秀的接口公共返回码体系&#xff0c;并提供Java实…

【八】python装饰器模式

文章目录 8.1 装饰器模式简介8.2 装饰器模式作用8.3 装饰器模式构成8.3.1 装饰器模式包含以下几个核心角色&#xff1a;8.3.2 UML类图 8.4 装饰器模式python代码实现8.4.1 基本装饰器的使用8.4.2 多个装饰器的执行顺序8.4.3 带返回值的装饰器的使用8.4.4 装饰器模式-关联类模式…

5V低压步进电机驱动芯片GC6150,应用于摄像机,机器人 医疗器械等产品中。具有低噪声、低振动的特点

GC6150是双通道5V低压步进电机驱动器&#xff0c;具有低噪声、低振动的特点&#xff0c;特别适用于相机变焦对焦系统、万向架、摇头机等精度、低噪声STM控制系统&#xff0c;该芯片为每个通道集成了一个256微步的驱动器。通过SPI & T2C接口&#xff0c;客户可以方使地调整驱…

OneNote for Windows10 彻底删除笔记本

找了超多方法&#xff0c;都没有用&#xff0c;我的OneNote都没有文件选项&#xff0c;要在OneDrive中删除&#xff0c;但是一直登不进&#xff0c;然后又找到一个方法&#xff1a; 在网页中打开Office的控制面板 "Sign in to your Microsoft account" 在“最近”一…

共筑首都绿色美好出行!苏州金龙再向北京交付33辆纯电动旅游大巴

应时而动&#xff0c;创新求变&#xff0c;方能始终屹立于市场。2023年&#xff0c;随着旅游市场的复苏&#xff0c;北京市旅游消费潜力进一步释放&#xff0c;客运需求量快速增长&#xff0c;与此同时绿色、高端、个性化旅游客车也成为市场趋势。 11月底&#xff0c;33辆苏州…

STM32单片机项目实例:基于TouchGFX的智能手表设计(4)LPBAM的应用

STM32单片机项目实例&#xff1a;基于TouchGFX的智能手表设计&#xff08;4&#xff09;LPBAM的应用 目录 一、概述 二、LPBAM简介 2.1 支持 LPBAM 的外设 三、LPBAM硬件机制 3.1 电源和时钟架构 3.2 速度限制 3.3 LPGPIO_IOToggle实验 一、概述 STM32U5 系列微控制器基…

uniapp实战 —— 可滚动区域 scroll-view (自适配高度,下拉刷新)

自适配高度 自定义的顶部导航栏&#xff0c;可参考博文 https://blog.csdn.net/weixin_41192489/article/details/134852124 如图可见&#xff0c;在页面滚动过程中&#xff0c;顶部导航栏和底栏未动&#xff0c;仅中间的内容区域可滚动。 整个页面的高度设置为 100%&#xf…