您的位置:

C++11新特性之lambda表达式的应用

一、什么是lambda表达式

在C++11之前,定义函数对象需要使用重载运算符的方式完成,而C++11中引入了lambda表达式,可以更加方便和直观地定义一个函数对象。

lambda表达式可以用来创建匿名函数对象,其语法格式如下:

[capture list] (parameters) mutable -> return_type { function body }

其中,方括号[]为lambda表达式的捕获列表,包含3种方式:

  1. 空捕获列表:[]
  2. 值捕获列表:[x, y, ...]
  3. 引用捕获列表:[&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编程、多线程编程等。