C lambda表示式簡介及作用

2021-10-24 07:34:56 字數 3088 閱讀 7220

在c語言中,可呼叫物件僅有函式指標。但在c++中,可呼叫物件增加了兩類,

// lambda

[ 《捕獲列表》 ] ( 《引數列表》 ) [options]

// 返回值即為乙個lambda表示式,每個lambda表示式在全域性範圍上都屬於特有的乙個類別

// 寫出類別很難,所以用auto關鍵字指定收變數的型別

// 譬如

auto add = (int lv, int rv) ;

// 例子

// 實現將外層作用域的乙個int值輸出

; printval();

val = 100;

printval();

}

輸出結果為

10

10

為什麼第二行輸出不是100呢?

是因為捕獲列表中寫了「val」,預設為值捕獲,如果想要引用捕獲則寫作[&val],輸出則為10 100,值得注意的是,上述lambda表示式沒有寫小括號,這是因為在不需要引數的時候,小括號可以省略

可以接受lambda表示式的stl-algorithm有很多,比如

// a vectorv 逆序排序

std::sort(v.begin(), v.end(), ( int n1, int n2 ) );

templateinline void sort(

_randomaccessiterator __first, _randomaccessiterator __last,

_compare __comp);

// __comp可以接受lambda表示式,並且也可以接受functor或函式指標

std::functionfunc() ;

}// in main-function

func()(10); // stdout : 10

auto func() ;

}// in main-function

func()(10); // stdout : 10

// g++編譯選項新增 -std=c++14

在c++11之前,標準庫提供了bind1stbind2nd用於將乙個二元函式裝飾為一元函式,c++11後標準庫提供了std::bind函式,將利用佔位符(std::placeholders::_1、_2、…)可以對乙個函式靈活裝飾(改變引數列表的順序、個數),利用lambda表示式也可以實現這種效果。

利用lambda實現bind效果的核心就是利用捕獲列表,譬如

// 假如由乙個函式bool greater(int lv, int rv),返回是否lv > rv,有這麼乙個場景,

// 有乙個有序容器,一群數字,用這一群數字切分這個有序容器。

// 利用std::find_if

std::vectornums = ; // 待切分的容器

std::vectorsliceflag = ; // 切分標誌

std::vector::iterator> res = ; // 用來儲存切分點

auto greaterthan = (int lv) ;

}; //

for (auto & f : sliceflag)

res.push_back(nums.end());

// test

for (int i = 0; i < res.size() - 1; ++i) );

std::cout << "\n";

}/****************************stdout********************************/

ps ~~~> .\test

-3, 1, 1,

3, 3, 4, 4,

5, 6, 8, 8,

10, 12,

c風格的可呼叫物件即函式指標作為元素存入容器時比較簡單的,但是對於lambda表示式,每個表示式都屬於乙個特有的型別,為了將很多lambda存入容器需要借助std::function,函式簽名同為type(args…)的lambda可以轉化為std::function,然後再將其都存入元素型別為std::function的容器即可,例子

int main () },

},},}};

std::string exp;

while (true) );

int rv = atoi(exp.c_str() + (iter - exp.begin()) + 1); // 運算子右值

std::string op; op.push_back(*iter);

std::printf("--> %d\n", opts.at(op)(lv, rv));

}return 0;

}// test

ps \\\\> ./test

1+1--> 2

2/3--> 0

456+9544

--> 10000

12*12

--> 144

1-90

--> -89

有時候,connect到的槽函式僅作為槽函式使用,沒有必要封成乙個member,使用lambda是乙個較好的選擇,這種情況下,原來形式的connect的第3個引數(接受者)就沒有用了。

// in constructor of class mainwidget(繼承自qwidget)

// 有乙個qpushbutton的指標, 名字為 pexitbutton

connect(pexitbutton, &qpushbutton::clicked, [this] ); // 需要注意的是,要捕獲this

注:有時候可能要在qt的.pro檔案中的config += c++11

c Lambda表示式簡介

c 11標準的lambda引入的主要目的是 能夠將類似於函式的表示式用作接受函式指標或函式符的函式引數,因此,典型的lambda表示式是測試表示式或者比較表示式,可編寫為一條語句,這使得lambda簡潔而易於理解。1 乙個lambda表示式有如下型別 capture list parameter l...

C lambda表示式末尾 的作用

includeusing namespace std int main auto u int a,int b cout 等價於 includeusing namespace std int main auto u int a,int b cout 細節 1.第二種方式必須帶返回值,否則會 error...

lambda表示式 C Lambda表示式

lambda宣告 lambda introducer。在內部,你可以指明乙個capture用來處理外部作用域內未被傳遞為實參的資料。意味著外部作用域以by value的方式傳遞給lambda。在lamdba中不能改變其值 為什麼?意味著外部作用域以by reference的方式傳遞給lambda。因...