C++中的lambda表達式
零、小序
學習過java、Python等語言的童鞋可能早就知道lambda表達式,C++直到C++11中才引入了lambda表達式,lambda表達式使用方便、代碼簡潔、定義和使用在同一個地方,而且不需要取名字就可以使用,它本身就是一個匿名的函數。它的好處可以說很多很多,來一起了解一下吧。
一、lambda表達式介紹
1、lambda表達式概念
lambda表達式是C++11中引入的,它是一種匿名函數,通常它作爲一個參數傳遞給接收函數指針或者函數符的函數使用。在C++的STL算法使用過程中,經常可以看到它的身影。
2、lambda表達式的優勢
1)遵守就近原則:隨時定義隨時使用,lambda表達式的定義和使用在同一個地方,並且lambda表達式可以直接在其他函數中定義使用,其他函數沒有這個優勢。
2)簡潔明瞭:lambda表達式相比較其他函數的更加的簡潔明瞭。
3)效率相對高些:lambda表達式不會阻止編譯器的內聯,而函數指針則會阻止編譯器內聯。
4)捕獲動態變量:lambda表達式可以捕獲它可以訪問的作用域內的任何動態變量。
3、lambda表達式基本語法
[capture list] (params list) mutable exception-> return type { function body }
表達式中各個參數的含義如下:
[capture list]:捕獲外部變量列表
(params list):形參列表
mutable:表示能不能修改捕獲的變量
exception:異常設定
return type:返回類型
function body:函數體
雖然lambda中的參數變量很多,通常情況下並不需要把每一個都使用上,根據自己的需要使用即可,大多數情況下可以直接省略->、mutable、exception,不需要返回類型的話也可以省略return type。一個簡單的lambda表達式:[](int x){return x*x;}。
4、lambda表達式捕獲外部變量方法
1)參數以值傳遞方式被捕獲:參數以值傳遞的方式傳入到lambda表達式中,值傳遞方式參數在lambda表達式中值不能被修改。
2)參數引用傳遞方式被捕獲:參數以引用的方式傳入到lambda表達式中,引用傳遞方式參數在lambda表達式內部修改和表達式外部的修改會相互影響。
3)表達式自行推導捕獲:當捕獲列表[capture list]中不傳入任何變量而是寫成[=]或者[&],lambda表達式會以值傳遞[=]或[&]引用傳遞的方式捕獲參數,參數的捕獲根據表達式中變量使用情況來推導。
二、lambda表達式代碼示例
// TestLambda.cpp : 此文件包含 "main" 函數。程序執行將在此處開始並結束。
//
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void myPrintf(int elem)
{
cout << elem << " ";
}
int main()
{
cout << "-----------lambda表達式的使用----------" << endl;
vector<int> tmpVector{};
tmpVector.resize(10);
int i = 10;
int num = 0;
cout << "-----------使用lambda表達給tmpVector賦值----------" << endl;
generate(tmpVector.begin(), tmpVector.end(), [i,&num]() {
num=i*i+num;
return num;
});
cout << "-----------打印i和num的值,以查看值傳遞和引用傳遞的區別----------" << endl;
cout << "i=" << i << " num=" << num << endl;
cout << "-----------打印tmpVector中的值----------" << endl;
for_each(tmpVector.begin(), tmpVector.end(), myPrintf);
cout << endl;
cout << "-----------給lambda表達指定一個名字----------" << endl;
int a = 100;
auto bFun = [a]()->int {return a / 10; }; // bFun是lambda表達式的名字
int c = bFun();
cout << "c=" << c << endl;
cout << "-----------lambda表達傳形參----------" << endl;
int countIndex = count_if(tmpVector.begin(), tmpVector.end(),
[](int x) {
return x / 1000 == 0; // 找到除以1000等於零的那個數在第幾個,注意下標序號從0開始
});
cout << "除以1000等於零在vector中的索引爲:countIndex=" << countIndex << endl;
cout << "-----------lambda表達默認捕獲外部變量,形參以值傳遞方式----------" << endl;
int tmpNum1 = 10;
int tmpNum2 = 5;
for_each(tmpVector.begin(), tmpVector.end(), [=](int x) {
x = x * tmpNum1 + tmpNum2;
cout << "x=" << x << endl;
});
for_each(tmpVector.begin(), tmpVector.end(), myPrintf);
cout << endl;
cout << "-----------lambda表達默認捕獲外部變量,形參以引用傳遞方式----------" << endl;
for_each(tmpVector.begin(), tmpVector.end(), [=](int &x) {
x = x * tmpNum1 + tmpNum2;
cout << "x=" << x << endl;
});
for_each(tmpVector.begin(), tmpVector.end(), myPrintf);
cout << endl;
std::cout << "Hello World!\n";
getchar();
}
運行結果:
能力有限,如有錯誤,多多指教!原創不易,點贊鼓勵一下吧!