C++ lambda表达式

lambda表达式

一个lambda表达式表示一个可调用的代码单元。我们可以将其理解为一个未命名的内联函数。一个lambda表达式具有一个返回类型、一个参数列表、一个函数体。

但与函数不同,lambda表达式可定义在函数内部。一个lambda表达式具有如下形式:

[capture list] (parameter list) -> return type  { function body }

与普通函数不同,lambda表达式必须使用尾置返回来指定返回类型。

何为尾置返回类型:

尾置返回类型跟在形参列表后面并以一个 -> 符号开头。为了表示函数真正的返回类型,我们在本应该出现返回类型的地方放置一盒auto:

//func接受一个int类型的实参,返回一个指针,该指针指向一个具有10个整形数的数组
auto func(int i) -> int (*)[10];

下面来一个应用的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using  namespace  std;
 
class  Solution
{
public :
     void  biggies(vector &words, vector::size_type sz)
     {
         //按字典顺序排序
         sort(words.begin(),words.end());
 
         //把重复部分置后
         auto end_unique = unique(words.begin(),words.end());
 
         //删除重复部分
         words.erase(end_unique,words.end());
 
         //按长度稳定排序(保持原有等长顺序)
         stable_sort(words.begin(), words.end(), []( const  string &a,  const  string &b){  return  a.size() < b.size(); });      
         //获取第一个指向大于sz的元素的迭代器      
         auto it = find_if(words.begin(), words.end(), [sz]( const string &str){  return  str.size() > sz; });
 
         //计算满足size大于sz的数目
         auto count = words.end() - it;
         cout << count << make_plural(count,  " word" "s" ) <<  " of length "  << sz <<  " or longer."  << endl;
 
         //输出长度大于sz的串
         for_each(it, words.end(), []( const  string &str){ cout << str <<  " " ; });    } 
 
         string make_plural( int  num, string word, string s)  
        
                 return  num > 1 ? word + s : word;
         }
 
     static  bool  isShorter( const  string &str1,  const  string &str2)
     {
         return  (str1.size() < str2.size());
     }
 
};
 
int  main( void )
{
     vector vec_str = { "HABCD" , "CDF" , "XYtrZ" , "UVWXY" , "LUOPMN" , "PLOPQ" , "RST" };
 
     Solution s;
 
     vector::size_type sz = 4;
 
     s.biggies(vec_str,sz);
 
     system ( "pause" );
     return  0;
}
### C++ Lambda 表达式简介 C++11 引入了 lambda 表达式这一特性,使得开发者可以在需要函数的地方直接定义匿名函数对象,而无需单独声明函数。这种机制不仅简化了代码结构,还增强了程序的灵活性[^4]。 #### 基本语法 Lambda 表达式的通用形式如下: ```cpp [capture](parameters) -&gt; return_type { body } ``` - **`capture`**: 定义如何捕获外部作用域中的变量(按值、按引用或其他方式)。 - **`parameters`**: 函数参数列表,类似于普通函数。 - **`return_type`**: 可选部分,默认情况下编译器会推导返回类型。 - **`body`**: 函数体,包含具体的逻辑实现。 --- ### 示例解析 以下是几个典型的 lambda 表达式使用场景及其对应的代码示例。 #### 1. 打印容器中的元素 通过 `std::for_each` 配合 lambda 表达式来遍历并打印向量中的数据。 ```cpp #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; using namespace std; int main() { vector&lt;int&gt; vec = {1, 2, 3, 4, 5}; // 使用 Lambda 表达式打印每个元素 for_each(vec.begin(), vec.end(), [](int x) { cout &lt;&lt; x &lt;&lt; &quot; &quot;; }); cout &lt;&lt; endl; return 0; } ``` 此代码展示了如何利用 lambda 表达式作为回调函数传递给标准库算法 `std::for_each`[^1]。 --- #### 2. 捕获局部变量 Lambda 表达式可以通过 `[ ]` 来捕获上下文中的变量。支持的方式有多种:按值 (`=`),按引用 (`&amp;`) 或显式指定单个变量。 ```cpp #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; using namespace std; int main() { int factor = 2; vector&lt;int&gt; vec = {1, 2, 3, 4, 5}; // 按值捕获变量 &#39;factor&#39; transform(vec.begin(), vec.end(), vec.begin(), [factor](int x) { return x * factor; }); for (auto num : vec) { cout &lt;&lt; num &lt;&lt; &quot; &quot;; } cout &lt;&lt; endl; return 0; } ``` 在此示例中,lambda 表达式捕获了名为 `factor` 的局部变量,并将其用于计算新数组的值[^2]。 --- #### 3. 返回复杂类型的 lambda 表达式lambda 表达式的返回值较为复杂时,可以显式指定其返回类型。 ```cpp #include &lt;functional&gt; #include &lt;iostream&gt; using namespace std; int main() { auto adder = [] (int a, int b) -&gt; int { return a + b; }; cout &lt;&lt; adder(3, 4) &lt;&lt; endl; // 输出 7 return 0; } ``` 上述代码显示了一个简单的加法操作,其中指定了返回类型为整数型。 --- ### 总结 Lambda 表达式极大地提高了 C++ 编程的便利性和可读性,尤其是在处理 STL 算法或者 GUI 应用开发时尤为有用。它们能够减少不必要的辅助函数定义,使代码更加紧凑高效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值