一、什麼是lambda表達式
在C++11之前,定義函數對象需要使用重載運算符的方式完成,而C++11中引入了lambda表達式,可以更加方便和直觀地定義一個函數對象。
lambda表達式可以用來創建匿名函數對象,其語法格式如下:
[capture list] (parameters) mutable -> return_type { function body }
其中,方括弧[]為lambda表達式的捕獲列表,包含3種方式:
- 空捕獲列表:[]
- 值捕獲列表:[x, y, …]
- 引用捕獲列表:[&x, &y, …]
括弧()表示參數列表;mutable關鍵字表示在函數體中可以修改值傳遞進來的參數值;箭頭 -> 表示返回類型;函數體用{}包括。
二、lambda表達式的捕獲列表
lambda表達式的捕獲列表決定了函數體中哪些變數可以被訪問。在捕獲列表中,可以使用表達式的值捕獲或引用捕獲,在捕獲的過程中可以使用lambda表達式中尚未定義的變數。下面是一個簡單的示例:
#include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { int x = 10; vector<int> v{1, 2, 3, 4, 5}; auto it = find_if(v.begin(), v.end(), [x](int i) { return i == x; }); if (it != v.end()) cout << "Found " << x << endl; else cout << "Not found " << x << endl; return 0; }
在這個示例中,lambda表達式中的[x]表示值捕獲,可以訪問x變數的值。如果將[x]改為[&x]表示引用捕獲,則可以修改x變數的值。
三、lambda表達式的用途
1. STL演算法
lambda表達式可以被用於STL演算法中,比如find_if、sort等。下面是一個將vector中的元素按照從大到小的順序排序的示例:
#include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { vector<int> v{5, 3, 2, 4, 1}; sort(v.begin(), v.end(), [](int a, int b) {return a > b;}); for (auto i : v) cout << i << " "; return 0; }
在這個示例中,lambda表達式用於sort演算法中,定義了一個比較函數,用於將vector中的元素按照從大到小的順序排序。
2. GUI編程
lambda表達式也可以被用於GUI編程中,比如Qt中的信號和槽機制。下面是一個簡單的示例:
#include <QApplication> #include <QPushButton> using namespace std; int main(int argc, char *argv[]) { QApplication a(argc, argv); QPushButton btn("Click me"); btn.show(); QObject::connect(&btn, &QPushButton::clicked, []() { QMessageBox::information(nullptr, "Message", "Hello Qt!"); }); return a.exec(); }
在這個示例中,lambda表達式用於QPushButton的clicked信號,表示按鈕被點擊時會彈出一個消息框。
3. 多線程編程
lambda表達式也可以被用於多線程編程中,比如std::thread中的線程函數。下面是一個簡單的示例:
#include <iostream> #include <thread> using namespace std; int main() { thread t([]() { cout << "Hello world from thread!" << endl; }); t.join(); return 0; }
在這個示例中,lambda表達式用於std::thread的構造函數中,表示新線程的函數。
四、總結
lambda表達式是C++11中一個非常實用的新特性,使得我們可以更加方便和直觀地創建函數對象,其用途很廣泛,包括STL演算法、GUI編程、多線程編程等。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/249768.html