c++之lambda表示式

Amazing life發表於2020-11-09

在寫程式碼時,我們會遇到這種程式碼:

sort(points.begin(),points.end(),[](const vector<int>& u,const vector<int>& v){
            return u[0] * u[0] + u[1] * u[1] < v[0] * v[0] + v[1] * v[1];
        });

我們知道sort()函式第三個引數是函式符,函式指標或者lambda表示式,而這個例子中後面一串長長的就是lambda表示式。

lambda表示式

特性:
1.使用[]替代函式名,沒有宣告返回型別;
2.返回型別自動推斷;
3.可指定名稱,比如:
auto mod3 = [](int x){return x % == 0};
4.可訪問作用域內的動態變數,有兩種方式:
按值訪問,[變數名]
加上&,按引用訪問,[&變數名]
[=]按值訪問所有變數,[&]按引用訪問所有;

int count13 = 0;
std::for_each(numbers.begin(),numbers.end(),[&count13](intx){count13 += x % 13 == 0});

為何使用:
使用整個lambda表示式替換函式指標或者函式符建構函式;
其定義和使用是在同一個地方進行的,不需要檢視原始碼,修改時也可以一目瞭然,同時將類似於函式的表示式用作接受函式指標或者函式符的函式的引數;

下面是一個使用例子(來自c++prime plus)

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <ctime>
const long Size = 390000L;

int main()
{
    using namespace std;
    vector<int> numbers(Size);
    srand(time(0));
    generate(numbers.begin(),numbers.end(),rand);
    cout << "sample size = " << Size << endl;

    int count3 = count_if(numbers.begin(),numbers.end(),
                          [](int x){return x % 3 == 0;});
    cout<<"count of numbers divisible by 3:" << count3 << endl;
    int count13 = 0;
    for_each(numbers.begin(),numbers.end(),
             [&count13](int x){count13 += x % 13 == 0;});
    cout<< "count of number divisible by 13:" << count13 << endl;

    count3 = count13 = 0;
    for_each(numbers.begin(),numbers.end(),
             [&](int x){count3 += x % 3 == 0;count13 += x % 13 == 0;});
    cout<< "count of number divisible by 3:" << count3 << endl;
    cout<< "count of number divisible by 13:" << count13 << endl;
    return 0;
}

這個例子主要是利用lambda表示式作為引數,判斷變數是否可以被3或者13整除
程式碼輸出:
程式碼輸出

相關文章