当前位置: 首页 > article >正文

C/C++ 谓词 lambda表达式

文章目录

  • 前言
  • 1. 引例
  • 2. 谓词的含义
    • 2.1 谓词运用
  • 总结

前言

最近看lambda相关知识点,发现这个概念比较难以理解,看了几遍。可能是第一次正式接触STL的原因,对标准库的泛型编程理解不够深刻。
这篇博客就写一下lambda的相关。


1. 引例

在介绍谓词之前我们先来看下面的几个例子。

我们使用标准库的sort函数,这个是默认为从小到大排序,是使用<
但是这个小于并非适用所有类型。因为它们可能没有明确定义的大小关系。

比如指针,两个指针分别指向两个数组。

int arr1[] = {1, 2, 3};
int arr2[] = {4, 5, 6};
int* p1 = arr1;
int* p2 = arr2;

// 这个比较没有定义
if (p1 < p2) {
    // ...
}

再比如迭代器,两个迭代器分别指向两个vector容器。

std::vector<int> vec1 = {1, 2, 3};
std::vector<int> vec2 = {4, 5, 6};
auto iter1 = vec1.begin();
auto iter2 = vec2.begin();

// 这个比较也没有定义
if (iter1 < iter2) {
    // ...
}

针对这种情况,我们一般考虑函数重载,来做到自定义类型的比较。

比如下面这个例子,一个类对象之间进行比较,这个就并不适用了。
我们想比较同一个类两个对象之间的value值大小,必须得自定义“小于”

class MyClass {
public:
    int value;

    // 重载 < 运算符
    bool operator<(const MyClass& other) const {
        return value < other.value;
    }
};

MyClass obj1{1};
MyClass obj2{2};

if (obj1 < obj2) {
    // ...
}

在这个例子中,我采用了重载的方式自定义了“小于”,从而实现了类对象之间的value值比较。

在STL中,我们使用谓词,来达到这个目的。

2. 谓词的含义

谓词函数是一个返回布尔值的函数,通常用于作为算法的参数,用来定义元素的排序、筛选等行为。
在C++中,谓词函数可以是函数指针、函数对象(functor)、Lambda 表达式等。

2.1 谓词运用

现在我们打算比较两个单词长度,定义如下函数:

bool isShorter(const string &s1, const string &s2) {
    return s1.size() < s2.size();
}

isShorter 就是一个谓词函数。

这个函数有两个参数,都是 const string & 类型的引用。这里使用引用是为了避免在函数调用时进行不必要的拷贝,提高效率。参数名为 s1 和 s2,分别表示两个待比较的字符串。

函数体内部只有一行代码,即 return s1.size() < s2.size();这行代码的作用是比较 s1 和 s2 的长度(使用 size() 函数),如果 s1 的长度小于 s2 的长度,则返回 true,否则返回 false。

我们现在使用如下语句对单词进行排序

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool isShorter(const string &s1, const string &s2) {
    return s1.size() < s2.size();
}
int main()
{
	vector<string> word={"edwinwzy","nice"};
	sort(word.begin(),word.end(),isShorter);
	for(auto &i:word){
		cout<<i<<" ";
	}
}

谓词函数在排序时,被用来判断两个元素的大小关系。在我的例子中,sort 函数调用时,会根据 isShorter 的比较结果来确定字符串的顺序。如果 isShorter(s1, s2) 返回 true,那么 s1 会被认为比 s2 “小”(或者说“短”),它们的相对顺序将被交换,从而实现按字符串长度升序排序的效果。

上面这个例子中,word.begin和word.end分别作为isShorter的s1,s2参数传入。这种支持两个函数传参的情况称为二元谓词,如果是一个参数,那就是一元谓词

这个情况有点像本来不支持使用<号的操作,我现在重载了这个运算符,只不过用可调用函数的方式进行改写,再传到STL中去。


总结

总结一下就是,谓词,作为标准库中的一个比较准则。这个比较准则是自定义的,是可调用的。我个人觉得有点像函数重载,只不过在STL中叫做谓词。当然后面lambda表达式对谓词的运用更进一步,后面再写。


http://www.kler.cn/news/155019.html

相关文章:

  • 自定义Vue的DockPanel-Layout
  • 深度学习记录--logistic回归损失函数向量化实现
  • LLM;超越记忆《第 2 部分 》
  • Echarts地图registerMap使用的GeoJson数据获取
  • Spring boot命令执行 (CVE-2022-22947)漏洞复现和相关利用工具
  • 高斯日记(cpp+java)
  • 线程安全的问题以及解决方案
  • 【重点】【双指针】15. 三数之和
  • Vue diff 算法探秘:如何实现快速渲染
  • Gson的用法详解
  • 中兴小鲜50 ZTE 畅行50 刷机救砖演示机7543n root 虎贲 展锐 T760 解锁BL
  • 人工智能 - 人脸识别:发展历史、技术全解与实战
  • 开源免费跨平台数据同步工具-Syncthing
  • Unity3D URP 自定义范围的特效热扭曲详解
  • LLM:《第 3 部分》从数学角度评估封闭式LLM的泛化能力
  • 安全SCDN对网站蜘蛛抓取有影响吗,使用SCDN对百度蜘蛛抓取有否好处
  • CentOS7 网络配置
  • Linux的权限(一)
  • Ubuntu22.04无需命令行安装中文输入法
  • C++生成静态库和动态库
  • 智慧用电安全动态监控系统
  • centos7-docker安装与使用
  • 网络虚拟化场景下网络包的发送过程
  • C/C++---------------LeetCode第35. 搜索插入位置
  • C++ day48 打家劫舍
  • 数学建模之典型相关分析
  • Redis--10--Pipeline
  • 乱序学机器学习——主成分分析法PCA
  • node.js express路由和中间件
  • c++ 写成.h .cpp main.cpp 多文件形式