精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C++面試題:C++11 引入 Lambda 解決什么問題?

開發(fā)
在 C++11 之前,若要在算法中傳遞自定義邏輯(如std::sort的比較函數(shù)),需通過函數(shù)指針或函數(shù)對象(仿函數(shù))實現(xiàn)。 

在 C++11 之前,若要在算法中傳遞自定義邏輯(如std::sort的比較函數(shù)),需通過函數(shù)指針或函數(shù)對象(仿函數(shù))實現(xiàn)。

一、C++11 引入了 Lambda

1. Lambda 的通用語法為:

[捕獲列表](參數(shù)列表) mutable(可選) noexcept(可選) -> 返回類型 { 函數(shù)體 }

2. 關(guān)鍵組成部分

(1) 捕獲列表(Capture List)控制 Lambda 如何訪問外部變量: 

  • [=]:以值捕獲外部變量(默認(rèn)不可修改,需mutable)。
  • [&]:以引用捕獲外部變量(需注意變量生命周期)。 
  • [var]或[&var]:顯式指定捕獲單個變量。 

示例: 

int x = 10;
auto lambda = [x](int y) { return x + y; }; // 值捕獲x

(2) 參數(shù)列表與函數(shù)體與普通函數(shù)類似,但參數(shù)可為空([ ])或省略返回類型(編譯器自動推導(dǎo))。 

(3) mutable 關(guān)鍵字允許修改值捕獲的變量(默認(rèn) Lambda 的 operator() 是 const 成員函數(shù),因此無法修改值捕獲的變量)。 

3. 底層實現(xiàn)原理

Lambda 在底層被編譯器轉(zhuǎn)換為匿名類,其核心機制如下: 

  • 捕獲的變量:作為類的成員變量存儲。
  • 重載的 operator():作為類的成員函數(shù),實現(xiàn) Lambda 的函數(shù)體邏輯。

示例:

// Lambda表達(dá)式
auto lambda = [x](int y) { return x + y; };

// 等效的匿名類
class __AnonymousClass {
public:
    __AnonymousClass(int x) : x(x) {}
    int operator()(int y) const { return x + y; }
private:
    int x;
};

二、C++11 之前的兩種方式存在以下問題

第一:函數(shù)指針無法直接捕獲上下文變量,功能受限。

函數(shù)指針無法捕獲上下文變量,只能依賴全局或靜態(tài)變量,導(dǎo)致代碼耦合且不安全。 

(1) 示例:使用函數(shù)指針實現(xiàn)回調(diào)

#include <iostream>

// 全局變量(用于傳遞上下文)
int threshold = 5;

// 函數(shù)指針類型
typedefbool(*FilterFunc)(int);

// 過濾函數(shù)(檢查是否大于閾值)
boolisGreaterThanThreshold(int x){
    return x > threshold;
}

// 使用回調(diào)的函數(shù)
voidfilterNumbers(const std::vector<int>& nums, FilterFunc func){
    for (int x : nums) {
        if (func(x)) {
            std::cout << x << " ";
        }
    }
}

intmain(){
    std::vector<int> nums = { 2, 7, 3, 9 };
    filterNumbers(nums, isGreaterThanThreshold); // 輸出7 9
    return0;
}

問題: 

  • 依賴全局變量threshold,導(dǎo)致代碼難以維護(hù)和線程不安全。
  • 若需要動態(tài)調(diào)整threshold,必須修改全局狀態(tài),破壞封裝性。

(2) Lamda 替代函數(shù)指針(捕獲上下文)

#include <iostream>
#include <vector>
#include <functional> // 需要包含此頭文件

voidfilterNumbers(const std::vector<int>& nums, std::function<bool(int)> func){
    for (int x : nums) {
        if (func(x)) {
            std::cout << x << " ";
        }
    }
}

intmain(){
    std::vector<int> nums = { 2, 7, 3, 9 };
    int threshold = 5;
    // Lambda可正常捕獲局部變量
    filterNumbers(nums, [threshold](int x) { return x > threshold; });
    // 輸出:7 9
    return0;
}

優(yōu)勢: 

  • 直接捕獲局部變量threshold,無需全局變量。 
  • 避免全局狀態(tài)污染,代碼更安全、可維護(hù)。 

第二:函數(shù)對象:需定義類并重載operator(),導(dǎo)致代碼冗余。

在 C++11 之前,若想傳遞一個自定義邏輯(例如給std::sort指定排序規(guī)則),必須定義一個類并重載operator(),導(dǎo)致代碼冗余。 

(1) 示例:使用仿函數(shù)實現(xiàn)自定義排序

#include <vector>
#include <algorithm>

// 定義一個仿函數(shù)類(比較規(guī)則:按絕對值升序)
structCompareAbsolute {
    booloperator()(int a, int b)const{
        returnabs(a) < abs(b);
    }
};

intmain(){
    std::vector<int> nums = { -3, 1, -5, 4 };
    // 使用仿函數(shù)對象作為排序規(guī)則
    std::sort(nums.begin(), nums.end(), CompareAbsolute());
    // 結(jié)果:1, -3, 4, -5(按絕對值排序)
    return0;
}

問題: 

  • 需要為每個簡單邏輯定義一個完整的類。 
  • 若需多個不同的比較規(guī)則,需定義多個類,代碼冗余嚴(yán)重。 

(2) Lamda 替代仿函數(shù)

#include <vector>
#include <algorithm>

int main() {
    std::vector<int> nums = { -3, 1, -5, 4 };
    // 直接使用Lambda作為排序規(guī)則
    std::sort(nums.begin(), nums.end(), [](int a, int b) {
        return abs(a) < abs(b);
    });
    // 結(jié)果:1, -3, 4, -5
    return 0;
}

優(yōu)勢: 

  • 無需定義單獨的類,代碼更緊湊。 
  • 邏輯直接內(nèi)聯(lián),可讀性更強(但是也得看習(xí)慣了,剛接觸可能覺得讀的不順暢)。 

三、方式對比總結(jié)

特性

函數(shù)對象(Functors)

函數(shù)指針

Lambda

代碼冗余

需定義類,代碼冗余

直接內(nèi)聯(lián),無冗余

上下文捕獲

通過類成員變量間接實現(xiàn)

無法捕獲,依賴全局變量

支持直接捕獲局部變量

靈活性

需預(yù)先定義多個類

只能使用全局/靜態(tài)變量

動態(tài)捕獲,邏輯更靈活

與 STL 算法結(jié)合

需要顯式實例化對象

不支持復(fù)雜邏輯

直接內(nèi)聯(lián),適配所有 STL 算法

四、注意事項

1. 懸空引用問題引用捕獲外部變量時,需確保變量的生命周期長于 Lambda

auto get_lambda() {
    int x = 10;
    return [&x]() { return x; }; // x已被銷毀,返回懸空引用!
}

2. Lambda 表達(dá)式捕獲變量后無法隱式轉(zhuǎn)換為函數(shù)指針

C++ 標(biāo)準(zhǔn)(ISO/IEC 14882)在 §7.5.5 中明確指出: 

A closure type for a non-generic lambda-expression with no lambda-capture has a public non-virtual non-explicit const conversion function to pointer to function having the same parameter and return types as the closure type’s function call operator. The value returned by this conversion function shall be the address of a function that, when invoked, has the same effect as invoking the closure type’s function call operator. 

  • 只有無捕獲的 Lambda 才能定義到函數(shù)指針的轉(zhuǎn)換函數(shù)。 
  • 有捕獲的 Lambda 沒有這樣的轉(zhuǎn)換函數(shù)。 

下面的代碼編譯錯誤:

#include <iostream>
#include <vector>

voidfilterNumbers(const std::vector<int>& nums, bool (*func)(int)){
    for (int x : nums) {
        if (func(x)) {
            std::cout << x << " ";
        }
    }
}

intmain(){
    std::vector<int> nums = { 2, 7, 3, 9 };
    int threshold = 5; // 局部變量
    
    // 使用Lambda捕獲局部變量threshold
    filterNumbers(nums, [threshold](int x) {
        return x > threshold;
    }); // 輸出7 9
    
    return0;
}

在 C++中,只有無狀態(tài) Lambda(不捕獲任何變量)可以隱式轉(zhuǎn)換為函數(shù)指針。一旦 Lambda 捕獲了局部變量(如threshold),它就變成了一個有狀態(tài)的閉包對象,類型不再是普通函數(shù)指針。 

代碼中: 

filterNumbers(nums, [threshold](int x) { ... }); // 傳遞有捕獲的Lambda

而filterNumbers的第二個參數(shù)是函數(shù)指針類型: 

void filterNumbers(..., bool (*func)(int)) { ... }

這會導(dǎo)致類型不匹配,編譯失敗。 

(1) 為什么無捕獲的 Lambda 可以轉(zhuǎn)換為函數(shù)指針?

函數(shù)指針本質(zhì)(如 bool (*func)(int))是一個指向獨立函數(shù)的指針,它不攜帶任何狀態(tài)(即沒有成員變量),且調(diào)用時不需要 this 指針。 

它的特點是: 

  • 函數(shù)指針無法保存成員變量(如 Lambda 捕獲的變量)。 
  • 函數(shù)指針的調(diào)用約定是固定的(如參數(shù)和返回類型),無法適配閉包對象的 operator()。 

當(dāng) Lambda 不捕獲任何變量時,生成的閉包類沒有成員變量,根據(jù)C++ 標(biāo)準(zhǔn),operator() 可能會被優(yōu)化成類似靜態(tài)成員函數(shù)。此時,Lambda 可以隱式轉(zhuǎn)換為函數(shù)指針。 

示例: 

auto lambda = [](int a) { return a * 2; };
int (*funcPtr)(int) = lambda; // 合法:無捕獲的 Lambda

編譯器生成的閉包類近似為: 

class __AnonymousLambdaClass {
public:
    static int operator()(int a) { // 靜態(tài)成員函數(shù)
        return a * 2;
    }
};

靜態(tài)成員函數(shù)不需要 this 指針,因此可以匹配函數(shù)指針類型。 

(2) 有捕獲的 Lambda 為什么不能轉(zhuǎn)換?

當(dāng) Lambda 捕獲變量時,閉包類的 operator() 是一個非靜態(tài)成員函數(shù),調(diào)用時需

要 this 指針訪問捕獲的成員變量。這與函數(shù)指針的調(diào)用約定不兼容。 

示例:

int x = 10;
auto lambda = [x](int a) { return a + x; };
int (*funcPtr)(int) = lambda; // 編譯錯誤!

編譯器生成的閉包類: 

class __AnonymousLambdaClass {
private:
    int x;

public:
    __AnonymousLambdaClass(int x) : x(x) {}

    // 非靜態(tài)成員函數(shù),隱含 this 指針
    int operator()(int a) const {
        return a + x;
    }
};

operator() 必須通過閉包對象(this 指針)調(diào)用,無法直接轉(zhuǎn)換為函數(shù)指針。 

五、總結(jié)

Lambda 的核心價值在于提供一種簡潔、安全的方式定義匿名函數(shù),尤其適用于: 

  • 快速實現(xiàn)回調(diào)函數(shù)。 
  • 簡化 STL 算法的使用。 
  • 捕獲局部變量實現(xiàn)靈活邏輯。
責(zé)任編輯:趙寧寧 來源: CppPlayer
相關(guān)推薦

2025-08-01 02:11:00

2024-05-29 13:21:21

2025-05-20 10:00:00

C++命名空間別名代碼

2021-10-27 11:00:30

C++語言面試

2025-05-23 08:15:00

C++constexpr字面類型

2025-06-16 03:22:00

2013-09-25 14:20:46

2011-03-29 14:31:41

CC++

2025-05-27 10:15:00

void*函數(shù)開發(fā)

2012-07-03 10:48:43

C++Lambda

2025-05-26 03:20:00

2013-11-29 09:51:26

C++雙重檢查鎖定

2009-08-11 10:12:07

C#算法

2025-05-06 08:20:00

互斥鎖C++編程

2020-06-01 21:07:33

C11C++11內(nèi)存

2013-10-15 09:48:03

C++Lambda函數(shù)式編程

2025-06-05 08:05:00

vectorC++對象存儲

2022-09-16 09:11:30

C++代碼編程

2025-05-20 08:10:00

函數(shù)函數(shù)類型函數(shù)指針類型

2024-06-04 14:52:28

點贊
收藏

51CTO技術(shù)棧公眾號

亚洲av永久纯肉无码精品动漫| 亚洲v国产v欧美v久久久久久| 超碰在线观看免费版| 韩国午夜理伦三级不卡影院| 欧美另类99xxxxx| 中文字幕一区二区人妻电影丶| 在线观看爽视频| 国产精品网友自拍| 91精品天堂| 69成人免费视频| 欧美大黑bbbbbbbbb在线| 日韩精品一区二区三区中文精品| 可以在线看的av网站| www.av在线| 国产精品综合一区二区| 欧美自拍大量在线观看| 神马久久精品综合| 少妇精品导航| 欧美一区二区三区白人| 日韩av在线综合| 91精选在线| 久久久777精品电影网影网| 成人字幕网zmw| 麻豆久久久久久久久久| 天天做天天爱综合| 亚洲三级av在线| 又大又长粗又爽又黄少妇视频| 二吊插入一穴一区二区| 一区二区不卡在线播放| 视频一区视频二区视频三区高| 亚洲精品视频专区| 久久成人免费网| 琪琪亚洲精品午夜在线| 青春草免费视频| 久久亚洲国产| 亚洲美女在线观看| 东京热av一区| 亚洲网站免费| 欧美怡红院视频| 欧美极品欧美精品欧美| 日本在线视频网址| 亚洲欧美日韩国产手机在线 | 国产专区精品| 欧美主播一区二区三区| 成人在线免费在线观看| 免费在线中文字幕| 亚洲美女偷拍久久| 天天综合中文字幕| 91伦理视频在线观看| 久久一夜天堂av一区二区三区 | www.浪潮av.com| 色呦呦在线播放| 亚洲精品免费在线| 在线不卡日本| 欧美jizzhd欧美| 亚洲国产精品黑人久久久| 免费观看成人高| 无套内谢的新婚少妇国语播放| 粉嫩av一区二区三区粉嫩| 91夜夜未满十八勿入爽爽影院 | 鲁鲁狠狠狠7777一区二区| 日本黄视频在线观看| 国产91丝袜在线播放| 97超碰人人看人人| 亚洲大尺度视频| 成人久久视频在线观看| 99久久99久久| 好男人www在线视频| 国产69精品久久777的优势| 99热最新在线| 人妻无码中文字幕| 99re热视频这里只精品 | 国产一区二区三区不卡视频网站 | 亚洲xxxxxx| 国产精品国产精品国产专区不蜜 | 欧美激情欧美| 国产丝袜高跟一区| 波多野结衣a v在线| 国产a久久精品一区二区三区| 怡红院精品视频| 亚洲色图27p| 综合在线一区| 高清一区二区三区日本久| 天天操天天射天天爽| 噜噜噜在线观看免费视频日韩 | 久久精品视频5| 久久久久国产精品一区二区| 国产精品免费一区二区三区都可以| 中文字幕你懂的| 国产一区二三区| 好吊色欧美一区二区三区四区| 飘雪影院手机免费高清版在线观看 | 免费看成人吃奶视频在线| 亚洲色图35p| 黄色一级大片在线免费观看| 影院欧美亚洲| 国产精品流白浆视频| 精品人妻久久久久一区二区三区 | 成人黄色在线观看| 性生活三级视频| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 成人免费av在线| 相泽南亚洲一区二区在线播放 | 一区二区三区 欧美| 成人精品在线| 日韩精品久久久久久福利| 国产欧美小视频| 激情文学一区| 国产日韩精品一区二区| 人妻精品无码一区二区| 国产精品蜜臀在线观看| a天堂资源在线观看| 日韩pacopacomama| 欧美岛国在线观看| 日本二区在线观看| 亚洲精品黄色| 国产精品久久av| 国模无码一区二区三区| 国产精品久久久久婷婷二区次| 丰满少妇大力进入| 小说区图片区亚洲| 亚洲欧美日韩一区二区三区在线| xxxxx99| 国产精品久久久免费| 91在线无精精品一区二区| 欧美精品少妇| 亚洲成年人影院| 亚洲精品国产久| 国模精品一区| 2019中文字幕在线观看| 午夜精品久久久久久久99老熟妇| 中文字幕欧美三区| 少妇性饥渴无码a区免费| 日韩欧美中文字幕一区二区三区 | 在线观看电影av| 欧美午夜电影一区| 永久免费看mv网站入口78| 亚洲午夜一区| 成人9ⅰ免费影视网站| 老司机午夜在线视频| 欧美性受xxxx| 一级片手机在线观看| 制服诱惑一区二区| 国产精品乱码一区二区三区| 黄色成人影院| 欧美日韩一卡二卡三卡| 国产精品高清无码在线观看| 国产亚洲精品v| 国产三区二区一区久久| 超免费在线视频| 欧美成人激情免费网| 成熟的女同志hd| 国产精品一区在线观看乱码| 影音先锋男人的网站| 91精品一久久香蕉国产线看观看| 色噜噜国产精品视频一区二区 | 国产在线拍揄自揄拍视频| 91精品国产综合久久精品性色| 五月天免费网站| 美女视频一区在线观看| 亚洲欧洲久久| 小说区图片区亚洲| 欧美xxxx18国产| a天堂在线观看视频| 中文字幕在线观看不卡| 日韩成人av免费| 欧美激情亚洲| 国产精品一区二区三区免费观看 | 亚洲线精品一区二区三区| 欧洲成人午夜精品无码区久久| 欧美日韩日本国产亚洲在线| 国产精品日韩一区二区三区| 欧美激情网站| 国产一区二区三区视频| 国产精品无码一区| 日韩毛片一二三区| 亚洲成人福利视频| 99这里有精品| 欧洲在线视频一区| 欧美黑粗硬大| 欧美激情综合色| 五月婷在线视频| 色婷婷国产精品| 国产馆在线观看| 国产乱子伦一区二区三区国色天香| 黄色a级片免费看| 欧美一级三级| 国产免费一区二区三区在线观看| 性欧美1819sex性高清大胸| 亚洲精品福利在线观看| 精品一区二区无码| 亚洲欧美成人一区二区三区| 屁屁影院国产第一页| 日本网站在线观看一区二区三区| 亚洲区一区二区三区| 欧美日韩午夜电影网| 欧美在线激情网| 中文字幕日本在线观看| 亚洲成成品网站| www欧美在线| 亚洲欧美日韩在线| theav精尽人亡av| 韩国一区二区在线观看| 国产一区二区网| 99热精品久久| 久久综合给合久久狠狠色| 欧洲美女精品免费观看视频| 欧美精品激情在线| 1024国产在线| 亚洲国产欧美自拍| 国产伦精品一区二区三区视频痴汉| 五月天国产精品| 国产精品嫩草影院俄罗斯 | 黄色一级片一级片| 波多野结衣视频一区| 日韩一级免费片| 久久福利毛片| 一卡二卡三卡视频| 国产精品久久久久久| 欧美精品欧美精品| 91精品入口| 91视频8mav| 国产麻豆一区| 欧洲美女7788成人免费视频| 日本乱理伦在线| www亚洲欧美| 东热在线免费视频| 亚洲精品成人网| 亚洲av无码一区二区乱子伦| 欧美日韩一级黄| 夜夜爽妓女8888视频免费观看| 亚洲成人av一区| 九九热精彩视频| 亚洲蜜臀av乱码久久精品| 日本不卡一区视频| 国产香蕉久久精品综合网| 欧美xxxx×黑人性爽| 国产精品一区二区无线| 不用播放器的免费av| 奇米一区二区三区av| 成人三级视频在线播放| 国产亚洲一区在线| 精品无码国模私拍视频| 亚洲天堂黄色| 中文精品无码中文字幕无码专区| 女人色偷偷aa久久天堂| 在线无限看免费粉色视频| 成人羞羞网站入口| 日韩高清av| 欧美日韩精品一区二区视频| 日本一区二区三区www| 久久不见久久见国语| 欧美日韩精品中文字幕一区二区| 啪啪激情综合网| 久久久久一区二区| 一区二区美女| 热舞福利精品大尺度视频| 国产精品探花在线观看| 日本成人三级| 日本久久黄色| 在线观看免费91| 一区二区三区中文| 中文字幕の友人北条麻妃| 欧美日韩一区二区三区四区在线观看| 日本一本草久p| 欧美日韩专区| 波多野结衣综合网| 久久性色av| 亚洲最大天堂网| 国产成人免费视频一区| 在线xxxxx| 国产视频一区二区在线| 日本猛少妇色xxxxx免费网站| 国产精品成人一区二区三区夜夜夜| 日韩国产第一页| 一区2区3区在线看| 伦av综合一区| 欧美人xxxx| 国产小视频一区| 亚洲人a成www在线影院| 成人77777| 久久91亚洲人成电影网站| 成人免费网站观看| 国产精品日韩精品| 亚洲一区电影| 乱色588欧美| 91久久久精品国产| 男女啪啪免费视频网站| 日韩成人免费看| 国产探花在线观看视频| 99久久精品国产麻豆演员表| 亚洲毛片亚洲毛片亚洲毛片| 亚洲国产欧美在线| 欧美一区二区三区不卡视频| 欧美精品乱码久久久久久按摩 | 国产不卡在线一区| 波多野结衣办公室33分钟| 国产精品久线在线观看| www.天天色| 3751色影院一区二区三区| 色哟哟中文字幕| 色先锋资源久久综合5566| 国产亚av手机在线观看| 国产精品扒开腿做爽爽爽的视频| 日韩一区免费| 亚洲 国产 日韩 综合一区| 在线播放亚洲| 色www免费视频| 99国内精品久久| 麻豆天美蜜桃91| 色婷婷综合久久| 丰满肥臀噗嗤啊x99av| 中文字幕成人在线| 超碰99在线| 91九色国产视频| 九九免费精品视频在线观看| 国产91沈先生在线播放| 久久精品国产第一区二区三区| 精品人妻一区二区三区日产| 1区2区3区国产精品| 五月天激情国产综合婷婷婷| 欧美xxxxx牲另类人与| 毛片网站在线免费观看| 欧美综合第一页| 精品欧美午夜寂寞影院| 最新av网址在线观看| 美女视频一区二区三区| 中文字幕在线看高清电影| 亚洲www啪成人一区二区麻豆| 国产色综合视频| 最近2019中文字幕mv免费看| 欧美三级网址| 久久精品一二三区| 亚洲久久一区| 在线观看亚洲免费视频| 亚洲精品视频在线看| 91久久精品无码一区二区| 一区二区欧美日韩视频| 欧美三级网址| 日本精品免费| 另类图片国产| 国产中年熟女高潮大集合| 欧美日韩在线视频首页| 日本激情一区二区| 高清视频欧美一级| 久久国产精品色av免费看| 国产www免费| 成人手机电影网| 国产一级淫片免费| 337p日本欧洲亚洲大胆色噜噜| 欧美性猛片xxxxx免费中国 | 无码少妇一区二区三区芒果| 久久久噜噜噜久久人人看| 综合激情网五月| 日韩国产在线播放| 小视频免费在线观看| 蜜桃传媒一区二区| 久久精品电影| www..com.cn蕾丝视频在线观看免费版 | 青青草原在线免费观看| 日韩欧美专区在线| 国产盗摄在线视频网站| 国产九色91| 国产精品五区| 美女洗澡无遮挡| 在线观看欧美精品| 欧美极品视频| 亚洲一区制服诱惑| 国产精品jizz在线观看美国| 亚洲色图欧美日韩| 日韩欧美大尺度| 国产一二在线观看| 成人女保姆的销魂服务| 欧美黄在线观看| 中文字幕a在线观看| 色8久久人人97超碰香蕉987| www.黄在线观看| 91情侣在线视频| 一本综合精品| 手机毛片在线观看| 欧美精选午夜久久久乱码6080| 神马午夜伦理不卡| 欧美第一黄网| 久久精品国产久精国产爱| 久草网站在线观看| 亚洲老头老太hd| 欧美成人家庭影院| bt天堂新版中文在线地址| 久久网站最新地址| 国产精品久久久久久久成人午夜| 久久97精品久久久久久久不卡| 秋霞影视一区二区三区| jizz欧美性11| 亚洲国产精品一区二区久久| 福利在线播放| 亚洲xxxx视频| 日本视频一区二区| 久久久久久激情| 丝袜亚洲另类欧美重口| 北条麻妃在线一区二区免费播放 |