C++實例詳解lambda表達式的使用
lambda表達式
- C++11 函數對象的升級版 =》 lambda表達式
- 函數對象的缺點:(需要定義一個類)
- 函數對象使用在 泛型算法參數傳遞 比較性質/自定義操作 優(yōu)先級隊列 智能指針(自定義智能指針的刪除器)
lambda表達式原理: 就是函數對象更高級的實現!
1、lambda表達式語法

例1:
lambda表達式對應函數對象小括號重載函數的。

- []為空,相當于構造函數不接收任何外部傳進來的變量。
- ()是運算符重載函數,具體接收的參數的個數
- 然后是返回值,看是無類型還是其他類型。
- 最后是函數代碼


[]不為空,相當于構造函數接收任何外部傳進來的變量a,b。
例2:



如果lambda表達式的返回值不需要,那么"->返回值"可以省略的

[捕獲外部變量]
[]:表示不捕獲任何外部變量
[=]:以傳值的方式捕獲外部的所有變量
[&]:以傳引用的方式捕獲外部的所有變量
[this]:捕獲外部的this指針
[=,&a]:以傳值的方式捕獲外部的所有變量,但是a變量以傳引用的方式捕獲
[a, b]:以值傳遞的方式捕獲外部變量a和b
[a, &b]:a以值傳遞捕獲,b以傳引用的方式捕獲
值傳遞:
加上mutable,表示將值傳遞的形參a,b改掉;不影響外部的實參。

引用傳遞:
修改的是實參,不需要加mutable

2、lambda應用
例1—從大到小排序


例2—按序插入元素65


例3—for_each


#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
vector<int> vec;
for (int i = 0; i < 20; i++)
{
vec.push_back(rand() % 100 + 1);
}
sort(vec.begin(), vec.end(), [](int a, int b)->bool
{
return a > b;
});
for (int val : vec)
{
cout << val << " ";
}
cout << endl;
//65按序插入序列 要找第一個小于65的數字
auto it = find_if(vec.begin(), vec.end(),
[](int a)->bool {return a < 65; });
if (it != vec.end())
{
vec.insert(it, 65);
}
for (int val : vec)
{
cout << val << " ";
}
cout << endl;
for_each(vec.begin(), vec.end(), [](int a)
{
if (a % 2 == 0)
cout << a << " ";
});
cout << endl;
return 0;
}3、lambda表達式的應用實踐
既然lambda表達式只能使用在語句當中,如果想跨語句使用之前定義好的lambda表達式,怎么辦?用什么類型來表示lambda表達式?
- lambda表達式 =》 函數對象 用function類型綁定它
- 用function類型表示函數對象的類型
- bind綁定器綁定的結果依然還是一個函數對象;
1、計算器案例

2、智能指針案例

3、優(yōu)先級隊列

上面寫法靈活性太差?,F在優(yōu)化:

priority_queue本身就有3個模板參數,分別是元素類型、容器類型、函數對象。
可以接收外部自定義的函數對象:

#include <iostream>
#include <functional>
#include <queue>
using namespace std;
class Data
{
public:
Data(int val1 = 10, int val2 = 10) :ma(val1), mb(val2) {}
int ma;
int mb;
};
int main()
{
//優(yōu)先級隊列
//priority_queue<Data> queue;
using FUNC = function<bool(Data&, Data&)>;
priority_queue<Data, vector<Data>, FUNC>
maxHeap([](Data& d1, Data& d2)->bool
{
return d1.mb > d2.mb;
});
maxHeap.push(Data(10, 20));
maxHeap.push(Data(15, 15));
maxHeap.push(Data(20, 10));
return 0;
}
到此這篇關于C語言實例詳解lambda表達式的使用的文章就介紹到這了,更多相關C語言lambda內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

