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編程、多線程編程等。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/249768.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 17:12
下一篇 2024-12-12 17:12

相關推薦

  • 深入理解ES5新特性

    ES5是ECMAScript5的簡稱,它是JavaScript的一種標準,自2009年推出以來一直被廣泛使用。相比之前的版本,ES5帶來了許多新特性和更好的語法支持。在本文中,將會…

    編程 2025-04-25
  • Java8新特性概述

    Java8是Java語言發行版的一個主要版本,Java8於2014年3月發布,引入了許多新功能和語言特性。其中,最受歡迎和最重要的之一就是Lambda表達式。 一、Lambda表達…

    編程 2025-04-24
  • 關係表達式的深度剖析

    一、關係表達式的定義 關係表達式是指在關係資料庫中為實現數據的最大效用和最快速度的數據檢索和存儲而定義的語法,表達式中的每一個元素(關係、屬性、常量等)均是資料庫的基本結構。 二、…

    編程 2025-04-23
  • 掌握lambda排序

    一、Lambda表達式簡介 Lambda表達式(又稱為函數式介面)為Java 8新增的一個功能,可使代碼更加簡潔。Lambda表達式的作用是向方法傳遞一個代碼塊,從而使代碼更加具有…

    編程 2025-04-23
  • Java 8新特性

    一、Lambda表達式 Lambda表達式是Java 8最大的特性之一。它是一種匿名函數,可以將函數作為參數傳遞給其他方法,或者作為返回值返回。 Lambda表達式主要由兩部分組成…

    編程 2025-04-23
  • Python 3.9:新特性全解析

    Python 3.9 於2020年10月5日發布。Python 3.9不僅為Python開發者帶來了新的特性,同時為Python社區帶來了一次重要的版本迭代升級。本篇文章主要介紹 …

    編程 2025-04-23
  • 探究ES6潛力——從多個方面看JavaScript ES6新特性

    一、let和const關鍵字 ES6引入let和const關鍵字,let用來聲明變數,尤其是在塊級作用域內,而const用來聲明只讀變數。例如: //let聲明變數 let a =…

    編程 2025-04-22
  • lambda遍歷map詳解

    一、基礎概念 1、lambda表達式的含義 lambda:arguemts:expression 其中,arguments表示lambda表達式的參數列表,expression則表…

    編程 2025-04-22
  • Java二元表達式:從基礎到優化

    一、基礎知識 Java二元表達式是指只有兩個操作數以及一個運算符的表達式,例如1+2、a<b或 x*y 。在Java語言中,對二元表達式的處理十分重要且廣泛,我們需要掌握基礎…

    編程 2025-04-18
  • 切面表達式:細節決定成敗

    一、切面表達式註解 註解是Java中非常重要的一種語法標記,Spring AOP中也通過註解的方式來定義切面。在定義切面時,可以使用@Aspect註解表示一個切面類,也可以使用@B…

    編程 2025-04-13

發表回復

登錄後才能評論