一、什么是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编程、多线程编程等。