簡介: CSDN博客專家,專注Android/Linux系統,分享多mic語音方案、音視頻、編解碼等技術,與大家一起成長!
優質專欄:Audio工程師進階系列【原創干貨持續更新中……】🚀
優質專欄:多媒體系統工程師系列【原創干貨持續更新中……】🚀
優質視頻課程:AAOS車載系統+AOSP14系統攻城獅入門實戰課【原創干貨持續更新中……】🚀
人生格言: 人生從來沒有捷徑,只有行動才是治療恐懼和懶惰的唯一良藥.
🍉🍉🍉文章目錄🍉🍉🍉
- 🌻1.前言
- 🌻2.Lambda函數與std::bind介紹
- 🌻3.代碼實例
- 🐓3.1 Lambda函數示例
- 🐓3.2 std::bind函數示例
- 🐓3.3 Lambda函數和std::bind結合使用的示例
🌻1.前言
本篇目的:C++之lambda函數與std::bind區別及用法實例
🌻2.Lambda函數與std::bind介紹
- C++11引入了lambda表達式,這是一種方便快捷的方式來創建匿名函數對象。Lambda函數在C++中非常有用,特別是在需要傳遞簡短的函數作為算法的參數時,例如在std::sort或std::find_if等算法中。Lambda函數可以有參數,并且可以包含一個表達式或者一個花括號內的一系列語句。
- Lambda函數的基本語法如下:
[捕獲列表](參數列表) mutable -> 返回類型 {// 函數體
}
- 捕獲列表用于指定lambda函數如何從外部環境捕獲變量。
- 參數列表定義了函數的參數。
- mutable修飾符允許在lambda函數中修改通過值捕獲的變量。
- 返回類型可以使用auto推斷,或者顯式指定。
- 函數體由花括號包圍,可以是單個表達式或者多條語句。
- 例如,一個lambda函數,接受兩個整數參數并返回它們的和:
auto add = [](int a, int b) -> int { return a + b; };
- std::bind函數用于綁定一個可調用對象(如函數、成員函數、Lambda表達式等)到一個或多個參數。這使得你可以創建一個新的可調用對象,該對象在調用時會使用綁定參數。std::bind常用于回調函數和函數對象,當你需要以特定參數列表調用一個函數,但是又不希望直接傳遞所有的參數時。
- std::bind的基本語法如下:
std::bind(可調用對象, 參數列表)
-
可調用對象是要綁定的函數或Lambda表達式。
-
參數列表是要傳遞給可調用對象的參數。
-
Lambda函數與std::bind的主要區別在于:
- Lambda表達式創建的是一個匿名函數對象,它可以獨立使用,而std::bind返回的是一個新的可調用對象,它依賴于原始的可調用對象。
- Lambda表達式可以直接作為函數參數傳遞,而std::bind通常用于綁定成員函數,并且需要指定對象實例。
- Lambda表達式可以有返回類型,而std::bind返回的類型的確切形式取決于被綁定函數的返回類型和參數類型。
- 總結來說,Lambda表達式和std::bind都是C++11中引入的有用特性,它們提供了不同的方式來創建和使用匿名函數。Lambda表達式適用于需要一個簡單的匿名函數對象的場景,而std::bind適用于需要將函數綁定到特定參數列表并創建一個新的可調用對象的場景。
🌻3.代碼實例
🐓3.1 Lambda函數示例
#include <iostream>int main() {// 一個lambda函數,接受兩個整數參數并返回它們的和auto add = [](int a, int b) -> int { return a + b; };// 使用lambda函數std::cout << add(10, 20) << std::endl; // 輸出30// 一個捕獲外部變量的lambda函數auto multiply = [x = 10](int y) -> int { return x * y; };std::cout << multiply(20) << std::endl; // 輸出200return 0;
}
🐓3.2 std::bind函數示例
#include <iostream>
#include <functional>class MyClass {
public:void myFunction(int a, int b) {std::cout << a + b << std::endl;}
};int main() {MyClass obj;// 使用std::bind綁定成員函數auto boundFunction = std::bind(&MyClass::myFunction, &obj, 10, 20);boundFunction(); // 輸出30return 0;
}
🐓3.3 Lambda函數和std::bind結合使用的示例
#include <iostream>
#include <functional>class MyClass {
public:void operator()(int a, int b) {std::cout << a + b << std::endl;}
};int main() {MyClass obj;// 使用lambda函數作為參數傳遞給成員函數auto memberLambda = [&obj](int a, int b) { obj(a, b); };// 使用std::bind將成員lambda函數綁定到成員函數auto boundMemberLambda = std::bind(memberLambda, 10, 20);boundMemberLambda(); // 輸出30return 0;
}