一、什麼是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
微信掃一掃
支付寶掃一掃