C++ Lambda 表达式中的捕获列表详解(表达式.捕获.详解.列表.Lambda...)

wufei123 发布于 2024-09-20 阅读(29)

在 c++++ lambda 表达式中,捕获列表允许捕获外部变量:按值捕获 ([x]):创建局部变量副本,不影响外部变量。按引用捕获 ([&x]):创建对外部变量的引用,修改反映在外部变量中。按引用传递 ([=]):允许修改外部变量,并返回排序后的副本。

C++ Lambda 表达式中的捕获列表详解

C++ Lambda 表达式中的捕获列表详解

在 C++ 中,Lambda 表达式是一种允许您创建匿名函数的对象。捕获列表是 Lambda 表达式的重要组成部分,它指定了从调用环境中捕获的变量。

捕获类型的概要

有三种类型的捕获:

  • 按值捕获 ([]):

    • 创建局部变量的副本并存储在 Lambda 表达式中。
    • 修改副本不会影响外部变量。
  • 按引用捕获 ([&]):

    • 创建对外部变量的引用。
    • 对 Lambda 表达式中的引用进行的更改将反映在外部变量中。
  • 按引用传递 ([=]):

    • 创建对外部变量的引用,同时允许修改这些变量。

使用捕获列表

在 Lambda 表达式中使用捕获列表时,遵循以下语法:

[capture_list] (parameter_list) -> return_type { body }

以下示例展示了不同类型的捕获:

// 按值捕获
int x = 5;
auto lambda1 = [x] { return x + 1; };

// 按引用捕获
int y = 10;
auto lambda2 = [&y] { y += 1; };

// 按引用传递
int z = 15;
auto lambda3 = [=] { ++z; };

实战案例:排序向量

以下实战案例演示了如何在 Lambda 表达式捕获列表中使用不同类型的捕获:

#include <vector>
#include <algorithm>

int main() {
  std::vector<int> vec = {1, 3, 5, 2, 4};

  // 按值捕获:使用局部副本 vec1 进行排序
  auto lambda1 = [vec1 = vec] (int a, int b) { return a < b; };
  std::sort(vec.begin(), vec.end(), lambda1);

  // 按引用捕获:修改原始 vec 进行排序
  auto lambda2 = [&vec] (int a, int b) { return a > b; };
  std::sort(vec.begin(), vec.end(), lambda2);

  // 按引用传递:修改原始 vec 并返回排序后的副本
  auto lambda3 = [=](int a, int b) { return a < b; };
  std::vector<int> vec3 = vec;
  std::sort(vec3.begin(), vec3.end(), lambda3);

  // 打印结果
  for (int i : vec) {
    std::cout << i << " ";
  }
  std::cout << "\n";

  for (int i : vec3) {
    std::cout << i << " ";
  }
  std::cout << "\n";

  return 0;
}

输出:

1 2 3 4 5
5 4 3 2 1

以上就是C++ Lambda 表达式中的捕获列表详解的详细内容,更多请关注知识资源分享宝库其它相关文章!

标签:  表达式 捕获 详解 

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。