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();
}

運行結果:
在這裏插入圖片描述

能力有限,如有錯誤,多多指教!原創不易,點贊鼓勵一下吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章