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...