欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++?Boost?Lambda表達式詳解

 更新時間:2022年11月18日 10:26:30   作者:無水先生  
Lambda?表達式(lambda?expression)是一個匿名函數(shù),Lambda表達式基于數(shù)學(xué)中的λ演算得名。本文就來為大家詳細講講C++中Lambda表達式的使用,需要的可以參考一下

lambda表達式格式

lambda表達式的格式

[捕捉列表](參數(shù)列表)mutable->返回值類型{ 語句部分 };

其中參數(shù)列表、返回值類型是可選的,捕捉列表、函數(shù)體可以為空。

先來看一個較為簡單的lamda表達式

int main(void)
{
	auto add = [](int a, int b)->int {return a + b; };
	cout << add(1, 2) << endl;
	return 0;
}

mutable可以省略,暫時不考慮。

  • 捕捉列表,捕捉列表的[]是千萬不能省略的,編譯器會根據(jù)[]判斷該表達式是否為lambda表達式,捕捉列表能夠捕捉上下文的變量提供給lambda表達式使用。
  • 參數(shù)列表,就和普通的函數(shù)傳參是一樣的,如果不需要參數(shù),那么可以連同()一起省略
  • mutable:默認情況下,lambda表達式參數(shù)列表和捕捉列表被修飾成const屬性,而mutable的作用就是取消它的const屬性。如果使用了mutable參數(shù)一定不能省略,如果參數(shù)為空,那么需要保留()
  • ->返回值類型。返回值類型明確或沒有返回值的情況下,該部分可省略,編譯器會對返回值類型進行推導(dǎo)。
  • 語句部分。和不同函數(shù)的函數(shù)體內(nèi)語句部分是一樣的含義,函數(shù)體內(nèi)不僅可以使用它的參數(shù),還可以使用所有捕獲到的變量。

所以最簡單的lambda表達式應(yīng)該是[]{}

lambda表達式又被稱為匿名函數(shù),無法被直接調(diào)用,它的底層其實也是仿函數(shù)類。需要借助auto將表達式賦值給一個變量。

說明Boost.Lambda

在 C++11 之前,您需要使用像 Boost.Lambda 這樣的庫來利用 lambda 函數(shù)。從 C++11 開始,這個庫可以被視為已棄用,因為 lambda 函數(shù)現(xiàn)在是編程語言的一部分。如果您在不支持 C++11 的開發(fā)環(huán)境中工作,您應(yīng)該在轉(zhuǎn)向 Boost.Lambda 之前考慮 Boost.Phoenix。 Boost.Phoenix 是一個較新的庫,如果您需要在沒有 C++11 的情況下使用 lambda 函數(shù),它可能是更好的選擇。

lambda 函數(shù)的目的是使代碼更緊湊且更易于理解(請參見示例 43.1)。

示例 43.1。帶有 lambda 函數(shù)的 std::for_each()的

#include <boost/lambda/lambda.hpp>
#include <boost/lambda/if.hpp>
#include <vector>
#include <algorithm>
#include <iostream>
int main()
{
  std::vector<int> v{1, 3, 2};
  std::for_each(v.begin(), v.end(),
    boost::lambda::if_then(boost::lambda::_1 > 1,
    std::cout << boost::lambda::_1 << "\n"));
}

Boost.Lambda 提供了幾個助手來創(chuàng)建無名函數(shù)。代碼寫在應(yīng)該執(zhí)行的地方,不需要包裝在函數(shù)中,也不必顯式調(diào)用函數(shù)。在示例 43.1 中,std::cout << boost::lambda::_1 << "\n" 是一個 lambda 函數(shù),它需要一個參數(shù),它在寫入標準輸出后跟一個新行。

boost::lambda::_1 是一個占位符,它創(chuàng)建一個需要一個參數(shù)的 lambda 函數(shù)。占位符中的數(shù)字決定了預(yù)期參數(shù)的數(shù)量,因此 boost::lambda::_2 預(yù)期兩個參數(shù),而 boost::lambda::_3 預(yù)期三個參數(shù)。 Boost.Lambda 只提供了這三個占位符。示例 43.1 中的 lambda 函數(shù)使用 boost::lambda::_1,因為 std::for_each() 需要一個一元函數(shù)。

包括 boost/lambda/lambda.hpp 以使用占位符。

請注意,\n 而不是 std::endl,在示例 43.1 中用于輸出新行。如果您使用 std::endl,該示例將無法編譯,因為 lambda 函數(shù) std::cout << boost::lambda::_1 的類型與一元函數(shù)模板 std::endl() 預(yù)期的類型不同。因此,您不能使用 std::endl。

示例 43.2。帶有 boost::lambda::if_then() 的 lambda 函數(shù)

#include <boost/lambda/lambda.hpp>
#include <boost/lambda/if.hpp>
#include <vector>
#include <algorithm>
#include <iostream>
int main()
{
  std::vector<int> v{1, 3, 2};
  std::for_each(v.begin(), v.end(),
    boost::lambda::if_then(boost::lambda::_1 > 1,
    std::cout << boost::lambda::_1 << "\n"));
}

頭文件 boost/lambda/if.hpp 定義了可用于在 lambda 函數(shù)中創(chuàng)建 if 控制結(jié)構(gòu)的結(jié)構(gòu)。最簡單的構(gòu)造是函數(shù)模板 boost::lambda::if_then(),它需要兩個參數(shù):第一個參數(shù)是一個條件。如果條件為真,則執(zhí)行第二個參數(shù)。兩個參數(shù)都可以是 lambda 函數(shù),如示例 43.2 所示。

除了 boost::lambda::if_then() 之外,Boost.Lambda 還提供函數(shù)模板 boost::lambda::if_then_else() 和 boost::lambda::if_then_else_return(),它們都需要三個參數(shù)。還為循環(huán)和轉(zhuǎn)換運算符提供函數(shù)模板,并在 lambda 函數(shù)中拋出異常。 Boost.Lambda 定義的許多函數(shù)模板使得定義 lambda 函數(shù)成為可能,這些函數(shù)絲毫不遜色于普通的 C++ 函數(shù)。

到此這篇關(guān)于C++ Boost Lambda表達式詳解的文章就介紹到這了,更多相關(guān)C++ Boost Lambda內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 從零學(xué)習cmake構(gòu)建系統(tǒng)

    從零學(xué)習cmake構(gòu)建系統(tǒng)

    這篇文章主要為大家介紹了從零學(xué)習cmake構(gòu)建系統(tǒng)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • C++簡單輸出鉆石菱形圖效果

    C++簡單輸出鉆石菱形圖效果

    這篇文章主要介紹了C++簡單輸出鉆石菱形圖效果,涉及C++簡單的數(shù)組操作與圖形打印技巧,需要的朋友可以參考下
    2016-05-05
  • C++ const和指針詳情

    C++ const和指針詳情

    這篇文章主要介紹了C++ const和指針,關(guān)于使用const來修飾指針,有兩種不同的方式。第一種是讓指針指向一個常量對象,這樣可以防止使用該指針進行修改指向的值。第二種則是將指針本身聲明為常量,可以防止改變指針指向的位置,下面來看看文章的詳細內(nèi)容
    2021-11-11
  • C++深入分析講解函數(shù)與重載知識點

    C++深入分析講解函數(shù)與重載知識點

    C++?允許多個函數(shù)擁有相同的名字,只要它們的參數(shù)列表不同就可以,這就是函數(shù)的重載(Function?Overloading),借助重載,一個函數(shù)名可以有多種用途
    2022-06-06
  • Qt?Creator配置opencv環(huán)境的全過程記錄

    Qt?Creator配置opencv環(huán)境的全過程記錄

    最近在PC端QT下配置opencv,想著以后應(yīng)該會用到,索性記錄下,這篇文章主要給大家介紹了關(guān)于Qt?Creator配置opencv環(huán)境的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • C#如何調(diào)用原生C++ COM對象詳解

    C#如何調(diào)用原生C++ COM對象詳解

    這篇文章主要給大家介紹了C#如何調(diào)用原生C++ COM對象,在C++中實現(xiàn)C#的接口。文中通過示例代碼介紹的很詳細,相信對大家的理解和學(xué)習會有一定的參考借鑒價值,有需要的朋友們下面來一起看看吧。
    2016-12-12
  • 一篇文章詳解Qt中如何訪問數(shù)據(jù)庫

    一篇文章詳解Qt中如何訪問數(shù)據(jù)庫

    Qt是一個廣泛使用的跨平臺應(yīng)用程序框架,它提供了許多功能,包括數(shù)據(jù)庫訪問,這篇文章主要給大家介紹了關(guān)于Qt中如何訪問數(shù)據(jù)庫的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-07-07
  • C語言編程中常見的五種錯誤及對應(yīng)解決方案

    C語言編程中常見的五種錯誤及對應(yīng)解決方案

    這篇文章主要給大家分享的是C語言編程中常見的五種錯誤及對應(yīng)解決方案,詳細內(nèi)容就請跟小編一起進入下面的文章內(nèi)容吧
    2021-10-10
  • C++回溯與分支限界算法分別解決背包問題詳解

    C++回溯與分支限界算法分別解決背包問題詳解

    給定n種物品和一背包。物品i的重量是wi,其價值為vi,背包的容量為C。問應(yīng)如何選擇裝入背包的物品,使得裝入背包中物品的總價值最大?下面我們分別用回溯與分支限界方法解決
    2022-06-06
  • 淺談C語言之字符串處理函數(shù)

    淺談C語言之字符串處理函數(shù)

    下面小編就為大家?guī)硪黄獪\談C語言之字符串處理函數(shù)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08

最新評論