精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

福利在线一区二区三区| 日韩免费在线观看视频| 国产欧美精品一二三| www久久日com| 99久久99久久精品国产片果冻 | 亚洲欧美日韩综合国产aⅴ| 亚洲欧美在线磁力| 午夜激情视频网| 麻豆理论在线观看| 国产精品久久久久久久第一福利 | 成人欧美一区二区三区视频网页 | 国产又猛又黄的视频| 97caopron在线视频| 99久久精品情趣| 91精品久久久久久久久久另类 | 老司机在线看片网av| 成人黄色在线看| 国产精品香蕉av| 日韩精品视频免费看| 99re6这里只有精品| 日韩精品极品毛片系列视频| www.com黄色片| 一本大道色婷婷在线| 亚洲女同ⅹxx女同tv| 日韩精品一线二线三线| 天堂在线观看免费视频| 国产一二精品视频| 国产精品一区二区三区成人| 日本一区二区不卡在线| 欧美在线网站| xxxxx成人.com| 三级网站在线免费观看| 国产三级精品三级在线观看国产| 欧美日韩成人激情| 日本wwww视频| 妞干网免费在线视频| 一区二区不卡在线播放| 成年人黄色在线观看| 成年人在线观看网站| 91碰在线视频| 久久99精品久久久久久水蜜桃| 国产老女人乱淫免费| 蜜桃久久久久久久| 国产精品久久一区| 波多野结衣午夜| 久久成人在线| 日韩av免费在线观看| 亚洲欧美偷拍视频| 亚洲一区二区三区高清不卡| 久久久久久97| 国产无码精品久久久| 激情欧美一区| 国内伊人久久久久久网站视频| 欧美激情一区二区视频| 这里只有精品在线| 欧美激情aaaa| 欧美亚洲天堂网| 国产欧美一区二区色老头| 国内揄拍国内精品少妇国语| 日本一级黄色录像| 国产欧美精品| 国产福利视频一区| 亚洲系列在线观看| 国产在线精品一区在线观看麻豆| 亚洲精品女av网站| 亚洲va久久久噜噜噜无码久久| 国产电影一区二区三区| 动漫3d精品一区二区三区 | 亚洲一区二区三区久久久| 欧美日韩中文国产| 天堂视频免费看| 视频二区欧美| 日韩电影中文字幕在线| 日本黄色网址大全| 成人一区二区| 欧美老女人性视频| 日韩乱码人妻无码中文字幕| 亚洲视频成人| 国产精品日韩专区| 国产成人av免费看| 99国产精品国产精品久久| 欧美日韩成人一区二区三区| 亚洲精品传媒| 亚洲专区一二三| 欧美视频在线播放一区| 国产三级一区| 亚洲国产精品电影| 免费看日本黄色片| 欧美精品黄色| 国产成人涩涩涩视频在线观看 | 国产一级片免费观看| 国产欧美日韩一区二区三区在线| 国产精品亚发布| 亚洲美女性生活| 久久久99久久| 亚洲爆乳无码精品aaa片蜜桃| 中文字幕这里只有精品| 在线成人av影院| 91精品国产自产| 久久久9色精品国产一区二区三区| 欧美极品在线播放| 成人毛片一区二区三区| 国产精品一区二区你懂的| 麻豆传媒一区二区| caoporn免费在线| 色94色欧美sute亚洲13| 欧美xxxx黑人| 成人精品天堂一区二区三区| 韩国日本不卡在线| 中文字幕在线2019| www久久精品| 91免费国产精品| 日本久久一区| 亚洲视频axxx| www.国产成人| 高清国产一区二区| 在线一区亚洲| 日韩毛片在线| 亚洲另类欧美自拍| 精品少妇theporn| 精品一区二区在线看| 鲁丝一区二区三区免费| 爱情岛亚洲播放路线| 欧美日韩高清在线| 超薄肉色丝袜一二三| 日韩视频精品在线观看| 亚洲淫片在线视频| av福利精品| 日本韩国一区二区三区视频| 天天躁日日躁狠狠躁av| 中文无码久久精品| 国产在线视频不卡| 91精品专区| 91黄视频在线| 亚洲黄色免费视频| 男人的天堂成人在线| 国产ts人妖一区二区| 国产亚洲精品久久飘花| 制服丝袜在线播放| 欧美一区二区三区性视频| 神马久久久久久久久久久| 性欧美videos另类喷潮| 国内精品久久国产| а√天堂中文在线资源8| 欧美xfplay| 国产一级理论片| 成人精品gif动图一区| 日本福利视频在线观看| 影音先锋欧美激情| 国模精品一区二区三区色天香| 国产黄色一级大片| 亚洲精品综合在线| 国产又粗又猛又爽又黄| 伊人久久亚洲影院| 精品乱子伦一区二区三区| 九色porny视频在线观看| 亚洲国产精品久久久久| 日韩精品久久久久久久酒店| 91网上在线视频| 日韩一级在线免费观看| 欧美精品久久久久久| 国产精品自在线| 国产视频一区二区| 亚洲第一免费播放区| 国产污污视频在线观看 | 亚洲精品成人无码| 青娱乐精品视频在线| 亚洲免费视频一区| 高清不卡一区| 久久久久中文字幕| 亚洲欧洲国产综合| 色天使久久综合网天天| xxxxx99| 狠狠色丁香婷综合久久| 国产精品视频二| 亚洲精品亚洲人成在线| 国产精品羞羞答答| 丁香高清在线观看完整电影视频| 日韩成人中文字幕| 18国产免费视频| 一区二区成人在线视频| 少妇户外露出[11p]| 日本成人中文字幕在线视频| 天天干天天色天天爽| 欧美人与动xxxxz0oz| 国产精品免费久久久| 国产黄a三级三级三级av在线看| 精品国产一区二区三区忘忧草 | 成人性教育av免费网址| 中文字幕av一区中文字幕天堂 | 日韩av中文在线| 中文字幕a级片| 亚洲一区在线视频观看| 亚洲一区二区三区蜜桃| 国产在线播精品第三| 日韩欧美视频网站| 97在线精品| 鲁片一区二区三区| 欧美影院精品| 国产精品久久久久久超碰| 丝袜国产在线| 中文字幕日韩综合av| 天堂av手机版| 欧美一区二区女人| 无码人妻久久一区二区三区| 亚洲午夜免费视频| 在线观看天堂av| 久久综合久久99| 亚洲妇女无套内射精| 日本怡春院一区二区| 免费一级特黄毛片| 91精品99| 亚洲精品国产一区| 一区二区美女| 国产激情一区二区三区在线观看 | 欧美精三区欧美精三区| 欧美精品二区三区| 国产精品乱码一区二区三区软件| 国产大学生视频| 国产在线视频一区二区三区| 欧美精品性生活| 乱人伦精品视频在线观看| 国产 欧美 日本| 亚洲第一偷拍| 永久久久久久| 色婷婷色综合| 日本在线播放不卡| 亚洲精品小区久久久久久| 国产精品v欧美精品∨日韩| 国产高清亚洲| 成人激情视频网| 美女色狠狠久久| 全亚洲最色的网站在线观看| av岛国在线| 欧美极品少妇xxxxⅹ免费视频| av文字幕在线观看| 久久精品成人一区二区三区 | 天海翼精品一区二区三区| 成人av资源网| 亚洲午夜精品| 91九色露脸| 2021年精品国产福利在线| 97视频中文字幕| 日韩欧美久久| 国产精品12| 91综合久久爱com| 国产经典一区二区三区| 99re6热只有精品免费观看| 99久久一区三区四区免费| 涩涩屋成人免费视频软件| 亚洲字幕在线观看| 盗摄系列偷拍视频精品tp| 福利视频久久| 日韩人体视频| 欧美精品久久| 人人狠狠综合久久亚洲婷婷| 日日夜夜精品网站| 国产精品久久久久久| 欧美一级免费在线观看| 欧美三区美女| 欧美深夜福利视频| 午夜综合激情| 黄色三级视频在线| 狠狠色丁香九九婷婷综合五月| 精品国产午夜福利在线观看| 国产乱码精品一品二品| 欧美熟妇精品一区二区| 高清成人免费视频| 国产吞精囗交久久久| 国产视频亚洲色图| 久久久久久久麻豆| 亚洲一区二区欧美激情| 91蜜桃视频在线观看| 欧美亚洲综合色| 国产成人精品亚洲精品色欲| 日韩你懂的在线观看| 神马久久精品| 久久精品国产清自在天天线| 欧美卡一卡二| 日本国产欧美一区二区三区| 精品女同一区二区三区在线观看| 99porn视频在线| 中国av一区| 精品少妇人妻av一区二区| 亚洲精品视频啊美女在线直播| 久久久久久三级| 国产精品一区二区免费不卡| 波多野结衣福利| 亚洲婷婷综合久久一本伊一区| 精品国产免费观看| 欧美精品丝袜中出| 神马电影在线观看| 久久夜色精品国产| 欧美男女交配| 91免费看网站| 成人中文在线| 国产老熟妇精品观看| 国精产品一区一区三区mba视频| 尤物网站在线观看| 亚洲视频免费看| 永久免费无码av网站在线观看| 欧美精品一级二级| 欧美扣逼视频| 欧美极品少妇全裸体| 亚洲国产aⅴ精品一区二区三区| 九九久久99| 欧美日韩一区二区三区四区在线观看 | 精品免费在线观看| 99热这里只有精品在线观看| 亚洲欧美在线x视频| 久久一卡二卡| 成人在线视频福利| 清纯唯美综合亚洲| 久久精品99国产| 成人午夜碰碰视频| 麻豆明星ai换脸视频| 在线精品视频一区二区三四| 狠狠人妻久久久久久综合麻豆 | 丰满的护士2在线观看高清| 国产精品免费一区豆花| 亚州综合一区| 日本a视频在线观看| 国产酒店精品激情| 萌白酱视频在线| 欧美色电影在线| 国产精品一二三区视频| 国产91av在线| 久草精品视频| 青青草精品视频在线| 国产91精品免费| 男人操女人的视频网站| 7777精品伊人久久久大香线蕉 | 亚洲欧美自拍另类日韩| 91麻豆文化传媒在线观看| 国产午夜激情视频| 精品美女被调教视频大全网站| 成人国产免费电影| 91久久久在线| 欧美69视频| 深夜做爰性大片蜜桃| 亚洲免费观看高清完整版在线| 国产精品一二三四五区| 久久在线精品视频| 久久久久毛片免费观看| 国产精品jizz在线观看老狼| 麻豆91在线看| www.xxxx日本| 日韩欧美亚洲国产另类| 七七成人影院| 精品视频免费观看| 亚洲永久在线| 中文天堂资源在线| 欧美军同video69gay| 在线三级中文| 国产精品一 二 三| 99riav国产精品| 成人免费网站黄| 欧美情侣在线播放| www.在线视频| 国产一区二区三区无遮挡| 免费欧美日韩| 日韩欧美黄色网址| 欧美精品99久久久**| 日韩免费影院| 久久久久国产精品视频| 日韩福利电影在线| 成人自拍小视频| 亚洲黄色av女优在线观看 | 尤物网在线观看| 91精品视频一区| 亚洲日本欧美| jizz中文字幕| 日韩美女在线视频| 神马午夜在线视频| 亚洲永久激情精品| 国产精品一区二区久久不卡| 九一国产在线观看| 日韩在线播放一区| 粉嫩av一区二区| 国产三级日本三级在线播放| 亚洲人成精品久久久久| 婷婷在线观看视频| 国产精品专区一| 亚洲精品乱码| 538精品视频| 亚洲国产天堂久久综合| 亚洲成人av观看| 免费的一级黄色片| 日本一区二区三区免费乱视频| 99视频在线观看免费| 热99精品里视频精品| 亚洲影视一区| 国产精品无码久久久久一区二区| 91精品国产综合久久福利| 国产一二在线播放| 中文字幕一区二区三区四区五区| 成人av资源在线| 国产乱色精品成人免费视频 | 一卡二卡三卡视频| 国产精品女同一区二区三区|