C lambda 函式物件 函式指標(函式名)

2021-10-01 06:35:06 字數 2941 閱讀 6267

stl演算法中通常會傳入乙個謂詞來實現自定義的排序,查詢數值等行為。

lambda/函式物件/函式指標(函式名)均可以在這個情境中傳遞資訊。在這種情境下對比一下三者的使用:

1.傳入函式指標(函式名)

例如,count_if ()函式的第三個引數是乙個一元謂詞。

若判數乙個數能否被3整除,則定義函式:

bool f3(int x)

使用:int count3 = std::count_if(v.begin(),v.end(),f3);

2.使用函式物件

class f_mod

bool operator() (int x)

};//也可用struct定義,預設訪問屬性為public

//定義物件: f_mod mod(3);

count3 = std::count_if(v.begin(),v.end(),f_mod(3));

3.lambda

count3 = std::count_if(v.begin(),v.end(), (int x) );

使用函式需要在本函式外部單獨定義乙個函式然後用來使用。

函式物件和lambda可以定義在函式內部。 所以**的修改及可讀性更好些。

lambda表示式拓展說明:

(1)lambda表示式完全由一條返回語句組成時,自動型別推斷才管用,否則,需要使用返回型別後置語法:

(double x) -> double

(2)可以給lambda表示式指定乙個名稱並多次使用

auto mod3 = (int x)

count1 = std::count_if(v.begin(),v.end(),mod3);

count2 = std::count_if(v.gegin(),v.end(),mod3);

或者像常規函式一樣使用有名稱的lambda表示式:bool result = mod3(z);

(3)訪問變數

[x]按值訪問變數x

[=]按值訪問所有動態變數

[&]按引用訪問所有動態變數

[=,&ed]按引用訪問ed,按值訪問其它

[&,ted]按值訪問ted,按引用訪問其它

[ted,&ed]按值訪問ted,及按引用訪問ed

例:int count3 = 0;

int count13 = 0;

std::foreach(v.begin(),v.end(),[&] (int x) );

其它應用場景,qt中的槽函式可以用lambda表示式

connect(ui->actionquit,&qaction::triggered,=);

函式物件拓展:

//函式模板 過載 函式呼叫操作符

template

class showelemt

void operator()(t &t)

void printcount()

public:

int n;

};//1 函式物件 基本使用

void main11()

template

class isdiv

bool operator()(t &t)

protected:

private:

t divisor;

};int a = 4;

isdiv mydiv(a);

it = find_if(v2.begin(), v2.end(), isdiv(4));

template

struct sumadd

};vector::iterator it = transform(v1.begin(), v1.end(), v2.begin(),v3.begin(), sumadd());

預定義函式物件和函式介面卡

1)預定義函式物件基本概念:標準模板庫stl提前定義了很多預定義函式物件,#include 必須包含。

//1使用預定義函式物件:

//類模板plus<> 的實現了: 不同型別的資料進行加法運算

void main41()

bool operator()(int &num)

return false;

}protected:

private:

int m_num;

};void main43()

for (vector::iterator it = v1.begin(); it!=v1.end(); it ++)

int num1 = count(v1.begin(), v1.end(), 3);

cout << 「num1:」 << num1 << endl;

//通過謂詞求大於2的個數

int num2 = count_if(v1.begin(), v1.end(), isgreat(2));

cout << 「num2:」 << num2 << endl;

//通過預定義函式物件求大於2的個數 greater() 有2個引數

// param > 2

int num3 = count_if(v1.begin(), v1.end(), bind2nd(greater(), 2 ) );

cout << 「num3:」 << num3 << endl;

//取模 能被2整除的數 求奇數

int num4 = count_if(v1.begin(), v1.end(), bind2nd(modulus (), 2 ) );

cout << 「奇數num4:」 << num4 << endl;

int num5 = count_if(v1.begin(), v1.end(), not1( bind2nd(modulus (), 2 ) ) );

cout << 「偶數num5:」 << num5 << endl;

return ;

}

C lambda 和 函式物件

include include include include include include using namespace std intadd const int a,const int b intsub const int a,const int b struct mulitiply int...

C lambda函式總結

c11新增加的特性,不過現在都c20了不新了。捕捉列表 引數 屬性 返回值型別引出符 因為lambda無法直接使用區域性變數,所以需要對變數進行捕捉,也就是需要通過捕捉列表通知c 這些變數我要拿來用。包含幾種不同的形式 形式 作用 x 表示以值傳遞的方式獲得變數x 表示以值傳遞的方式獲取所有父作用域...

函式指標和函式物件

函式指標分為全域性函式指標和類成員函式指標.函式指標型別為全域性函式.include stdafx.h using namespace std class testaction typedef void fp int void drink int i void eat int i class tes...