国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C++】 Lambda表達式詳解

這篇具有很好參考價值的文章主要介紹了【C++】 Lambda表達式詳解。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?? 問題

描述

記得去年立了一個重學(xué)C++新特性的flag,可是真的太忙了,大部分精力都花在全棧上了,今年開始看一些開源源碼,發(fā)現(xiàn)各種奇怪的語法,根本看不懂,不學(xué)不行了。而且接觸了很多語言后,發(fā)現(xiàn)新特性的確能提高開發(fā)效率,所以還是重新學(xué)習(xí)下C++吧。

環(huán)境

版本號 描述
文章日期 2023-06-09
操作系統(tǒng) Win11 - 21H2 - 22000.1335
C++在線工具 https://c.runoob.com/compile/12/

1?? 什么是Lambda表達式

Lambda表達式是C++11中新增的一種函數(shù)對象,它可以方便地定義一個匿名函數(shù),從而簡化代碼的編寫。
Lambda表達式的本質(zhì)是一個可調(diào)用對象,可以像函數(shù)一樣被調(diào)用,也可以作為函數(shù)參數(shù)或返回值。

Lambda 表達式的各個部分

下面是作為第三個參數(shù) std::sort() 傳遞給函數(shù)的簡單 lambda:

#include <algorithm>
#include <cmath>

void abssort(float* x, unsigned n) {
    std::sort(x, x + n,
        // 下面是一個簡單的 `Lambda 表達式`
        [](float a, float b) {
            return (std::abs(a) < std::abs(b));
        } 
    ); 
}

下圖顯示了 lambda 語法的各個部分:

  1. 捕獲列表:(capture list)(在 C++ 規(guī)范中也稱為 Lambda 引導(dǎo)。)
  2. 參數(shù)列表:(parameters list)(可選)。 (也稱為 Lambda 聲明符)
  3. mutable 規(guī)范:(可選)。
  4. 異常說明:exception-specification(可選)。
  5. 返回類型:trailing-return-type(可選)。
  6. Lambda 體:也就是函數(shù)體。
    【C++】 Lambda表達式詳解

引用大佬的一張圖:
【C++】 Lambda表達式詳解

2?? 優(yōu)缺點

優(yōu)點

  1. 簡化代碼:Lambda表達式可以將一些冗長的代碼簡化為一行代碼,使代碼更加簡潔。
  2. 提高可讀性:Lambda表達式可以使代碼更加易讀,減少了一些冗余的代碼,使代碼更加簡潔明了。
  3. 提高可維護性:Lambda表達式可以使代碼更加易于維護,因為它可以將一些復(fù)雜的邏輯封裝在一個方法中,使代碼更加模塊化。

缺點

  1. 學(xué)習(xí)成本高:Lambda表達式需要一定的學(xué)習(xí)成本,需要理解函數(shù)式編程的概念和Lambda表達式的語法。
  2. 可讀性降低:有時候Lambda表達式可能會使代碼變得更加難以理解,特別是當(dāng)Lambda表達式嵌套時。
  3. 性能問題:Lambda表達式可能會影響程序的性能,因為它需要創(chuàng)建一個新的對象來表示Lambda表達式。但是,這種影響通常是微不足道的,只有在極端情況下才會有明顯的性能問題。

3?? 使用場景

Lambda表達式可以用于任何需要函數(shù)對象的場景,例如:

  • STL算法中需要傳遞函數(shù)對象的地方,如std::sort、std::for_each等;
  • STL容器中需要傳遞比較函數(shù)的地方,如std::set、std::map等;
  • 多線程編程中需要傳遞回調(diào)函數(shù)的地方,如std::thread、std::async等。

在線C++工具

為了方便演示,找了個在線C++工具 https://c.runoob.com/compile/12/ ,可以直接在網(wǎng)頁中運行C++代碼。
效果圖如下:
【C++】 Lambda表達式詳解

STL算法庫

find_if應(yīng)用實例

#include <iostream>
#include <deque>
#include <algorithm>

using namespace std;

int main()
{
	int x = 5;
	int y = 10;
	deque<int> coll = { 1, 3, 19, 5, 13, 7, 11, 2, 17 };
	auto pos = find_if(coll.cbegin(), coll.cend(), [=](int i) {                 
		return i > x && i < y;
	});
	
	cout << "find " << (pos != coll.end() ? "success" : "failed");

   return 0;
}

sort實例,用于對一個整數(shù)數(shù)組進行排序:
以上代碼中,Lambda表達式[](int a, int b) { return a < b; }用于指定排序規(guī)則,即按照升序排列。

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

int main()
{
    std::vector<int> vec = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};

    // 使用Lambda表達式對vec進行排序
    std::sort(vec.begin(), vec.end(), [](int a, int b) { return a < b; });

    // 輸出排序后的結(jié)果
    // 1 1 2 3 3 4 5 5 5 6 9 
    for (auto x : vec)
    {
        std::cout << x << " ";
    }
    std::cout << std::endl;

    return 0;
}

STL容器中需要傳遞比較函數(shù)

在線工具不能正常運行:

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

int LambdaContainer()
{
	auto fc = [](const std::string& a, const std::string& b) {
		return a.length() > b.length();
	};
	std::map<std::string, int, decltype(fc)> myMap = { {"apple", 5}, {"banana0", 10}, {"orange", 15} };

	// 使用迭代器遍歷map
	std::cout << "使用迭代器遍歷map:" << std::endl;
	for (auto it = myMap.begin(); it != myMap.end(); ++it) {
		std::cout << it->first << " : " << it->second << std::endl;
	}

	// 需要C++20支持
	std::map < std::string, int, decltype([](const std::string& a, const std::string& b) {
		return a.length() < b.length();
	}) > myMap2 = { {"apple", 5}, {"banana0", 10}, {"orange", 15} };
	// 使用范圍for循環(huán)遍歷map
	std::cout << "\n\n使用范圍for循環(huán)遍歷map:" << std::endl;
	for (const auto& [key, value] : myMap2) {
	    std::cout << key << " : " << value << std::endl;
	}

	return 0;
}

針對myMap,需要C++17支持
針對myMap2, decltype中使用lambda需要C++20支持
【C++】 Lambda表達式詳解

多線程示例

在線工具不能正常運行:
【C++】 Lambda表達式詳解

#include <iostream>
#include <thread>
#include <vector>
#include <algorithm>

int main()
{
    // vector 容器存儲線程
    std::vector<std::thread> workers;
    for (int i = 0; i < 5; i++) 
    {
        workers.push_back(std::thread([]() 
        {
            std::cout << "thread function\n";
        }));
    }
    std::cout << "main thread\n";

    // 通過 for_each 循環(huán)每一個線程
    // 第三個參數(shù)賦值一個task任務(wù)
    // 符號'[]'會告訴編譯器我們正在用一個匿名函數(shù)
    // lambda函數(shù)將它的參數(shù)作為線程的引用t
    // 然后一個一個的join
    std::for_each(workers.begin(), workers.end(), [](std::thread &t) 
    {
        t.join();
    });

    return 0;
}

4?? Lambda表達式與函數(shù)指針的比較

Lambda表達式與函數(shù)指針類似,都可以用于定義函數(shù)對象。但是,Lambda表達式相比函數(shù)指針具有以下優(yōu)點:

  • Lambda表達式可以捕獲外部變量,從而方便地訪問外部環(huán)境;
  • Lambda表達式可以定義在函數(shù)內(nèi)部,從而避免了命名沖突的問題;
  • Lambda表達式可以使用auto關(guān)鍵字自動推導(dǎo)返回值類型,從而簡化代碼。

5?? 捕獲列表

Lambda表達式的捕獲列表用于指定Lambda表達式中使用的外部變量。捕獲列表可以為空,也可以包含以下內(nèi)容:

  • []:不捕獲任何外部變量;
  • [&]:以引用方式捕獲所有外部變量;
  • [=]:以值方式捕獲所有外部變量;
  • [var1, var2, ...]:指定捕獲特定的外部變量;
  • [&, var1, var2, ...]:以引用方式捕獲所有外部變量,并指定捕獲特定的外部變量;
  • [=, &var1, &var2, ...]:以值方式捕獲所有外部變量,并以引用方式捕獲特定的外部變量。

6?? 返回值類型

Lambda表達式的返回值類型可以顯式指定,也可以使用auto關(guān)鍵字自動推導(dǎo)。如果Lambda表達式的函數(shù)體只有一條語句,且該語句的返回值類型可以自動推導(dǎo),則可以省略返回值類型和return關(guān)鍵字。

7?? 工作原理

編譯器會把一個Lambda表達式生成一個匿名類的匿名對象,并在類中重載函數(shù)調(diào)用運算符,實現(xiàn)了一個operator()方法。
auto print = []{cout << "Hello World!" << endl; };為例,編譯器會把上面這一句翻譯為下面的代碼:

class print_class
{
public:
	void operator()(void) const
	{
		cout << "Hello World!" << endl;
	}
};
// 用構(gòu)造的類創(chuàng)建對象,print此時就是一個函數(shù)對象
auto print = print_class();

ps: 仿函數(shù)(functor)又稱為函數(shù)對象(function object)是一個能行使函數(shù)功能的類。仿函數(shù)的語法幾乎和我們普通的函數(shù)調(diào)用一樣,不過作為仿函數(shù)的類,都必須重載operator()運算符,仿函數(shù)與Lamdba表達式的作用是一致的。
stl中含有大量類似的對象,如std::less
【C++】 Lambda表達式詳解文章來源地址http://www.zghlxwxcb.cn/news/detail-477382.html

?? 參考資料

  • 微軟Lambda教程 https://learn.microsoft.com/zh-cn/cpp/cpp/lambda-expressions-in-cpp?view=msvc-170
  • C++ Lambda表達式詳解 https://blog.csdn.net/qq_37085158/article/details/124626913
  • 在線C++工具 https://c.runoob.com/compile/12/
  • 在線C++工具2 https://www.json.cn/runcode/run_cpp920/

到了這里,關(guān)于【C++】 Lambda表達式詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • java lambda表達式詳解

    java lambda表達式詳解

    我們知道,在Java中,接口是不能實例化的,但是接口對象可以指向它的實現(xiàn)類對象。如果接口連實現(xiàn)對象都沒有呢?那還可以使用匿名類的方式,如下: 復(fù)制 但是,使用匿名內(nèi)部的方式,代碼量其實并不是非常簡潔,而為了使代碼更加的簡潔,Java引進了 Lambda 表達式的寫法,

    2024年02月03日
    瀏覽(34)
  • 【C++】C++11——lambda表達式

    【C++】C++11——lambda表達式

    我們之前都是通過函數(shù)指針、仿函數(shù)的方式可以像函數(shù)使用的對象,在C++11之后,就有了Lambda表達式 為了實現(xiàn)一個比較算法, 都要重新去寫一個類,如果每次比較的邏輯不一樣,還要去實現(xiàn)多個類,特別是相同類的命名,看代碼的人就遭殃了,非常的煩,這些都非常地不方便

    2024年01月17日
    瀏覽(21)
  • C++的lambda表達式(匿名函數(shù))

    從C++11開始,C++也支持使用lambda表達式(匿名函數(shù))。Lambda表達式是一種便捷的方式,可以定義一個函數(shù)對象,而無需使用顯式的函數(shù)對象類型或函數(shù)指針語法。 C++中的 lambda表達式的基本語法如下: 其中各個部分的含義如下: capture list :用于指定所捕獲的外部變量列表???/p>

    2024年02月08日
    瀏覽(48)
  • C++ Lambda表達式的常見用法

    C++ Lambda表達式的常見用法

    ??我叫憶_恒心,一名喜歡書寫博客的在讀研究生?????。 如果覺得本文能幫到您, 麻煩點個贊 ??唄! 近期會不斷在專欄里進行更新講解博客~~~ 有什么問題的小伙伴 歡迎留言提問歐,喜歡的小伙伴給個三連支持一下唄。?????? 作為C++11的新特性的Lambada表達式本身

    2024年01月16日
    瀏覽(37)
  • Java 8 Lambda表達式詳解

    在Java 8中,引入了一種全新的函數(shù)編程概念,即Lambda表達式。這是一個重要的進步,它讓Java的功能得以大幅擴展,同時還讓代碼變得更加簡潔明了。接下來,我將詳細(xì)介紹Lambda表達式的相關(guān)知識,包括其基本語法、使用場景和特性。 Lambda表達式基本的語法可以分為三個部分

    2024年02月08日
    瀏覽(48)
  • 【C++】C++11語法 ~ lambda 表達式

    【C++】C++11語法 ~ lambda 表達式

    (???(??? )??,我是 Scort 目前狀態(tài):大三非科班啃C++中 ??博客主頁:張小姐的貓~江湖背景 快上車??,握好方向盤跟我有一起打天下嘞! 送給自己的一句雞湯??: ??真正的大師永遠懷著一顆學(xué)徒的心 作者水平很有限,如果發(fā)現(xiàn)錯誤,可在評論區(qū)指正,感謝?? ????

    2024年01月20日
    瀏覽(63)
  • C++系列十:日常學(xué)習(xí)-Lambda表達式

    目錄 前言 必備理論知識: 例子: 20230920 加 例如 對函數(shù)指針和指針函數(shù)補充: 有C#經(jīng)驗,使用起來,駕輕就熟。 就是語法糖。但是也要熟悉用法,才好眾享絲滑。 內(nèi)容參考: Chatjpt、文心一言 C++ lambda 表達式是一種功能強大的編程工具,它允許您在代碼中創(chuàng)建匿名函數(shù)或閉

    2024年02月08日
    瀏覽(19)
  • 【Java基礎(chǔ)】Java Lambda表達式詳解

    【Java基礎(chǔ)】Java Lambda表達式詳解

    Lambda 表達式,即函數(shù)式編程是 JDK8 的一個新特性,也被稱為閉包,Lambda表達式允許把函數(shù)作為一個方法的參數(shù),即行為參數(shù)化,函數(shù)作為參數(shù)傳遞進方法中。 Lambda表達式可以取代大部分的匿名內(nèi)部類,寫出更優(yōu)雅的 Java 代碼,尤其在集合的遍歷和其他集合操作中,可以極大

    2024年02月04日
    瀏覽(25)
  • Java中Lambda表達式使用及詳解

    Lambda表達式(閉包):java8的新特性,lambda運行將函數(shù)作為一個方法的參數(shù),也就是函數(shù)作為參數(shù)傳遞到方法中。使用lambda表達式可以讓代碼更加簡潔。 Lambda表達式的使用場景:用以簡化接口實現(xiàn)。 關(guān)于接口實現(xiàn),可以有很多種方式來實現(xiàn)。例如:設(shè)計接口的實現(xiàn)類、使用匿

    2024年02月03日
    瀏覽(22)
  • Learning C++ No.30 【lambda表達式實戰(zhàn)】

    Learning C++ No.30 【lambda表達式實戰(zhàn)】

    北京時間:2023/6/9/9:13,今天8:15起床,可能是最近課非常少,導(dǎo)致寫博客沒什么壓力,什么時間都能寫,導(dǎo)致7點起不來,哈哈哈,習(xí)慣睡懶覺了,但是問題不大,還在可控范圍內(nèi),并且就在前天下午,我們進行了學(xué)校MySQL的期末考試,大一就學(xué)MySQL,我甚是想吐糟,實操題對于

    2024年02月08日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包