C++函数对象Functor与匿名函数对象Lambda表达式详解

yizhihongxing

C++函数对象Functor与匿名函数对象Lambda表达式详解

什么是函数对象?

C++中的函数对象指的是重载了“()”运算符的类,可以像函数一样被调用,也被称为仿函数。与普通的函数不同的是,函数对象可以保存状态信息或者自定义行为,更加灵活。

在实现上,函数对象重载的“()”运算符应该是一个const成员函数,参数及返回值根据需要而定。函数对象的实现可以参考下面的代码:

class MyFunctor{
public:
    int operator() (int a, int b) const{
        return a + b;
    }
};

函数对象与算法的结合

函数对象通常和STL中的算法一起使用,可以非常方便的实现各种需求。如下面的代码所示,使用std::sort函数对vector容器进行排序,需要传入一个排序的规则比较函数对象。

#include <algorithm>
#include <vector>
#include <iostream>

class MyLess{
public:
    bool operator() (const int& lhs, const int& rhs) const{
        return lhs < rhs;
    }
};

int main()
{
    std::vector<int> nums = {3, 1, 4, 2, 5};
    std::sort(nums.begin(), nums.end(), MyLess());
    for(int num : nums){
        std::cout << num << " ";
    }
}

输出结果为:1 2 3 4 5

Lambda表达式

Lambda表达式是C++11引入的新特性。它是一种匿名函数对象,可以在需要使用函数对象的地方定义,非常方便。Lambda表达式的格式如下:

[capture list] (param list) -> ret type {body};

其中,capture list是捕获列表,用来捕获一些变量,可以为空;param list是形参列表,可以为空;ret type是返回值类型,可以为空;body是函数体。

下面是一个简单的例子,演示Lambda表达式的使用:

#include <iostream>

int main()
{
    auto func = [](){ std::cout << "Hello World" << std::endl; };
    func();
}

输出结果为:Hello World

在上面的代码中,使用auto关键字定义了一个Lambda表达式,并将其赋值给func变量,然后通过调用func()函数来执行Lambda表达式中定义的内容。

Lambda表达式与算法的结合

与函数对象一样,Lambda表达式可以和STL中的算法一起使用。下面是一个实现将vector中的元素按照奇偶性进行分组的例子:

#include <algorithm>
#include <vector>
#include <iostream>

int main()
{
    std::vector<int> nums = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    std::vector<int> odds;
    std::vector<int> evens;
    std::for_each(nums.begin(), nums.end(), [&](int num){
        if(num % 2 == 1){
            odds.push_back(num);
        }
        else{
            evens.push_back(num);
        }
    });
    std::cout << "Odd numbers:";
    for(int num : odds){
        std::cout << " " << num;
    }
    std::cout << std::endl << "Even numbers:";
    for(int num : evens){
        std::cout << " " << num;
    }
}

输出结果为:Odd numbers: 1 3 5 7 9
Even numbers: 2 4 6 8

在上面的代码中,使用std::for_each函数对vector容器中的元素逐一处理,并通过Lambda表达式将奇数和偶数分别插入到不同的容器中。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++函数对象Functor与匿名函数对象Lambda表达式详解 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 浅谈html特殊字符 编码css3 content:”我是特殊符号”

    下面是关于”浅谈HTML特殊字符编码CSS3 content”的攻略: HTML特殊字符 在HTML中,有一些字符是有特殊含义的,例如<和>用于表示标签的开始与结束,如果我们想要在HTML中显示这些字符本身,就需要使用特殊字符。 特殊字符使用&和;来表示,其中&为特殊字符的开始标记,;为特殊字符的结束标记。例如,&lt;表…

    C 2023年5月22日
    00
  • C语言 实现N阶乘的程序代码

    对于实现N阶乘的程序代码,我们可以采用循环的方式进行求解,以下是详细的攻略: 1. 首先明确需求 我们需要实现一个能够求解N阶乘的程序代码,N可以是任意非负整数。 2. 编写程序代码 由于需要使用循环来进行计算,因此我们可以使用for循环来实现。以下是程序的代码: #include <stdio.h> int main() { int n, fa…

    C 2023年5月23日
    00
  • Gin框架之参数绑定的实现

    Gin框架之参数绑定的实现 1. 参数绑定 在Gin框架中,我们可以通过Context结构体中的方法Bind方法来进行参数绑定。Bind方法提供的参数绑定能力非常强大,支持多种类型的参数绑定,例如querystring参数、form参数、json格式参数、xml格式参数等。 2. 示例 2.1 绑定querystring参数 package main imp…

    C 2023年5月23日
    00
  • php通过文件头判断格式的方法

    当我们通过PHP对一个文件进行处理的时候,有时候我们需要判断该文件的格式,从而进一步进行处理。在PHP中,我们可以通过文件头来判断文件的格式。 文件头,也称为魔数(Magic Number),是一个文件开头的特定几个字节,常用来标识文件类型。每种文件类型都有自己的魔数,根据不同的魔数来判断文件的类型,可以防止拓展名被篡改的情况下被误判。 判断文件类型的方法:…

    C 2023年5月23日
    00
  • 详解Dijkstra算法原理及其C++实现

    详解Dijkstra算法原理及其C++实现 前言 Dijkstra算法是一种常见的求解单源最短路径的算法,本文将对其进行详细的讲解。 原理 Dijkstra算法的核心思想是贪心,即每次都选择当前最短路径上距离起点最近的顶点,并通过该顶点更新与其相邻的顶点的距离。Dijkstra算法使用一个数组dist[i]来记录起点到每个顶点的最短距离,同时使用一个visi…

    C 2023年5月22日
    00
  • snprintf函数的用法解析

    让我来向你介绍一下snprintf函数的用法解析。 什么是snprintf函数 snprintf是一个C库函数,用于格式化字符串并将结果输出到指定缓冲区。与printf函数不同的是,snprintf在输出的同时将结果存储在指定缓冲区中。它可以避免缓冲区溢出,因为在输出到缓冲区之前已经设置了输出的最大长度。 该函数的原型为: int snprintf(char…

    C 2023年5月22日
    00
  • C语言 二级指针详解及示例代码

    我会为你讲解如何撰写“C语言 二级指针详解及示例代码”的完整攻略。 C语言 二级指针详解及示例代码 什么是二级指针? 在C语言中,指针是一种非常重要的数据类型。通过指针可以访问内存中的任何数据。指针也可以指向指针,这种指针称之为二级指针。简单地说,二级指针就是一个指向指针的指针。 声明二级指针 声明二级指针的方式与声明一级指针的方式类似,只需要在指针类型前面…

    C 2023年5月24日
    00
  • JSON 基本使用教程

    JSON 基本使用教程 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读并编写,便于机器解析和生成。它基于JavaScript语言的一个子集,因此它的使用十分广泛。本文将详细讲解JSON的使用。 1. 数据结构 JSON的数据结构只包含以下两种类型: 对象(Object):由花括号{}包含,键值对之间用逗…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部