c++中 lambda 表达式 解析

简介: c++中 lambda 表达式 解析

Lambda表达式应用

1. 基本语法

[捕获列表](参数列表) -> 返回类型 {
    函数体 }

2. STL算法结合

// 自定义排序
vector<Student> students;
sort(students.begin(), students.end(), 
    [](const Student& a, const Student& b) {
   
        return a.score > b.score;  // 降序排列
    });

// 条件删除
vector<int> data {
   1,3,5,7,9};
data.erase(remove_if(data.begin(), data.end(),
                    [](int x) {
    return x%2 == 0; }), 
          data.end());

// 累积计算
double product = accumulate(data.begin(), data.end(), 1.0,
                           [](double a, double b) {
    return a * b; });

3. 捕获方式对比

捕获方式 效果 适用场景
[] 不捕获任何外部变量 纯算法操作
[=] 值捕获所有外部变量 需要变量快照
[&] 引用捕获所有外部变量 需要修改外部状态
[var] 值捕获特定变量 精确控制捕获变量
[this] 捕获当前类对象 类成员函数中的lambda

示例

class SensorMonitor {
   
    vector<double> readings;
    double threshold;
public:
    void checkReadings() {
   
        // 捕获this以访问成员变量
        int count = count_if(readings.begin(), readings.end(),
                            [this](double val) {
    
                                return val > this->threshold; 
                            });
        cout << "超过阈值的读数数量:" << count << endl;
    }
};

4. 泛型Lambda(C++14+)

auto print = [](const auto& item) {
     // 自动推导类型
    cout << item << endl;
};

vector<int> nums {
   1, 2, 3};
list<string> words {
   "apple", "banana"};
for_each(nums.begin(), nums.end(), print);
for_each(words.begin(), words.end(), print);

5. 延迟执行模式

// 创建闭包延迟执行
auto createLogger(const string& prefix) {
   
    return [prefix](const string& message) {
   
        cout << "[" << prefix << "] " << message << endl; 
    };
}

auto debugLog = createLogger("DEBUG");
auto errorLog = createLogger("ERROR");
debugLog("System initialized");
errorLog("Connection lost");

常见陷阱与解决方案

  1. Lambda悬空引用

    function<void()> createCallback() {
         
     int localVar = 42;
     // return [&localVar]() { ... };  // 危险!局部变量将被销毁
     return [localVar]() {
          ... };     // 正确:值捕获
    }
    
  2. 类型推导问题

    auto lambda = [](auto x, auto y) {
          return x + y; };
    // 明确返回类型避免意外结果
    auto safeLambda = [](auto x, auto y) -> decltype(x+y) {
          return x + y; };
    
目录
相关文章
|
4月前
|
程序员 编译器 C++
【实战指南】C++ lambda表达式使用总结
Lambda表达式是C++11引入的特性,简洁灵活,可作为匿名函数使用,支持捕获变量,提升代码可读性与开发效率。本文详解其基本用法与捕获机制。
157 46
|
9月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
7月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
261 12
|
7月前
|
存储 监控 算法
基于 C++ 哈希表算法的局域网如何监控电脑技术解析
当代数字化办公与生活环境中,局域网的广泛应用极大地提升了信息交互的效率与便捷性。然而,出于网络安全管理、资源合理分配以及合规性要求等多方面的考量,对局域网内计算机进行有效监控成为一项至关重要的任务。实现局域网内计算机监控,涉及多种数据结构与算法的运用。本文聚焦于 C++ 编程语言中的哈希表算法,深入探讨其在局域网计算机监控场景中的应用,并通过详尽的代码示例进行阐释。
137 4
|
10月前
|
C# Android开发 iOS开发
2025年全面的.NET跨平台应用框架推荐
2025年全面的.NET跨平台应用框架推荐
401 23
|
11月前
|
消息中间件 开发框架 监控
NET任务调度框架Hangfire使用指南
Hangfire 是一个用于 .NET 应用程序的开源任务调度框架,支持长时间运行任务、定时任务等。通过简单的安装配置,即可将任务从主线程分离,提升应用性能。支持多种数据库,提供丰富的任务类型如立即执行、延迟执行和周期性任务,并有可视化管理界面 Hangfire Dashboard。还支持安全性配置及扩展插件,如 Hangfire.HttpJob,适合各种复杂场景下的任务调度需求。
1064 1
NET任务调度框架Hangfire使用指南
|
9月前
|
安全 编译器 C语言
【C++篇】深度解析类与对象(中)
在上一篇博客中,我们学习了C++类与对象的基础内容。这一次,我们将深入探讨C++类的关键特性,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载、以及取地址运算符的重载。这些内容是理解面向对象编程的关键,也帮助我们更好地掌握C++内存管理的细节和编码的高级技巧。
|
9月前
|
存储 程序员 C语言
【C++篇】深度解析类与对象(上)
在C++中,类和对象是面向对象编程的基础组成部分。通过类,程序员可以对现实世界的实体进行模拟和抽象。类的基本概念包括成员变量、成员函数、访问控制等。本篇博客将介绍C++类与对象的基础知识,为后续学习打下良好的基础。
|
11月前
|
存储 算法 安全
基于红黑树的局域网上网行为控制C++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。
|
11月前
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
292 5