卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章76107本站已运行4318

C++ 匿名函数与函数对象的相似之处

匿名函数与函数对象都是 c++++ 中的匿名函数形式,允许创建无名函数。它们具有相似之处:匿名性、函数调用、参数和返回值、捕获能力。实战案例中,lambda 表达式用于向量排序,函数对象用于链表排序。

C++ 匿名函数与函数对象的相似之处

C++ 匿名函数与函数对象的相似之处

在 C++ 中,匿名函数和函数对象都是匿名函数的形式,没有显式名称。它们本质上非常相似,都允许我们创建一个无名函数,而无需为其指定名称。然而,它们之间也存在一些细微的差别。

Lambda 表达式:匿名函数

立即学习“C++免费学习笔记(深入)”;

Lambda 表达式是一种匿名函数,它使用以下语法定义:

[capture_clause](params) -> return_type { body }
  • 捕获子句允许您指定要从外部范围捕获的变量。
  • 参数列表指定函数的参数。
  • 返回值类型指定函数的返回值类型。
  • 函数体包含函数的主体。

示例:

auto add = [](int a, int b) { return a + b; };

函数对象:类实现的函数

函数对象是实现为类的匿名函数。它们通过 operator() 方法实现匿名函数的功能,如下所示:

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

示例:

Adder add;

相似之处

  • 匿名性:两者都是匿名函数,不需要指定名称。
  • 函数调用:两者都可以通过函数调用语法调用,就像命名函数一样。
  • 参数和返回值:两者都可以定义参数和返回类型。
  • 捕获能力:两者都支持通过捕获子句或隐式捕获机制从外部作用域捕获变量。

实战案例

// 使用 lambda 表达式排序向量
vector<int> vec = {1, 3, 5, 2, 4};
sort(vec.begin(), vec.end(), [](int a, int b) { return a > b; });

// 使用函数对象排序链表
list<int> lst = {1, 3, 5, 2, 4};
lst.sort(Adder());

注意:

  • Lambda 表达式只能在 C++11 及更高版本中使用,而函数对象可以在更早版本的 C++ 中使用。
  • 函数对象通常比 lambda 表达式更灵活,因为它们可以具有状态和方法。
卓越飞翔博客
上一篇: golang框架性能优化的实用指南
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏