Stories

Detail Return Return

C++lambda表達式簡單筆記 - Stories Detail

lambda表達式語法

#include <iostream>

int main(int argc, char* argv[])
{
	/**
	* 1. 基本形式與語法
	*/

	//如果沒有傳入參數,參數列表可以省略
	auto lambda1 = []() { std::cout << "Hello, World !" << std::endl; };
	auto lambda2 = [](int x, int y) -> int //返回參數可使用尾置返回語法
		{
			if (x > y)
				return 1;
			else if (x < y)
				return -1;
			else
				return 0;
		};

	/**
	* 輸出:
	* Hello, World !
	*/
	lambda1();
	/**
	* 輸出:
	* -1
	*/
	std::cout << lambda2(1, 2) << std::endl;
	/**
	* 輸出:
	* 1
	*/
	std::cout << lambda2(2, 1) << std::endl;
	/**
	* 輸出:
	* 0
	*/
	std::cout << lambda2(1, 1) << std::endl;

	return 0;
}

捕獲

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>

int main(int argc, char* argv[])
{
	/**
	* lambda表達式捕獲外部變量示例
	*/

	std::vector<int> vec{ 1,2,3,4,5,6,7,8,9,10 };
	std::string str;

	//&str為引用捕獲,在函數內部可以被修改
	std::for_each(vec.begin(), vec.end(), [&str](int n) {
		str.append(std::to_string(n)).append(",");
		});
	str.pop_back();

	/**
	* 輸出:
	* 1,2,3,4,5,6,7,8,9,10
	*/
	std::cout << str << std::endl;

	//argc為值捕獲(拷貝),該變量在函數內部修改後不會影響外部變量
	std::for_each(argv, argv + argc, [argc](char* args) {
		/**
		* 輸出命令行參數
		*/
		std::cout << args << std::endl;
	});

	/**
	* 關於其他捕獲語法:
	* [=]: 所有外部變量的捕獲均為值捕獲(拷貝)
	* [&]: 所有外部變量的捕獲均為引用捕獲
	* [=, var...]: var以引用捕獲,其他外部變量以值捕獲
	* [&, var...]: var以值捕獲,其他外部變量以引用捕獲
	*/

	return 0;
}

其他

當lambda表達式不使用[]捕獲時,其表現與函數指針相同;如果使用了[]捕獲,則會變成帶有成員變量(引用或拷貝)和重載operator()函數運算符的類,所以將lambda表達式代入參數為函數指針的函數時,不能使用[]捕獲。

user avatar u_16231477 Avatar puxiaoke6 Avatar jkkang Avatar hedzr Avatar liu_chen Avatar manxisuo Avatar feixianghelanren Avatar wanmuc Avatar mrbone11 Avatar kedixa Avatar goodcitizen Avatar saltymilk Avatar
Favorites 14 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.