C 仿函式 三 bind和lambda

2022-06-08 22:03:12 字數 2447 閱讀 5734

#include
示例一
void usebinddemo()
//convert a regular function into functor

double pow(double x, double y)

void usebinddemo2()

}

void usebinddemo3() 

vectord;

transform(myset.begin(), myset.end(), back_inserter(d),

bind(logical_and(),

bind(greater(), placeholders::_1, 2),

bind(less(), placeholders::_1, 10)));

//d

copy(d.begin(), d.end(), ostream_iterator(cout, " "));

}

通常我們見到bind的時候他通常和std::function或者函式指標差不多。

但是std::function通常說的是某類函式長什麼樣子,比如輸入為兩個int返回為bool的可以定義為

using func = std::functiom;
但是如果我我們想用某個具體的函式時,如果使用函式指標可以這樣寫

bool func_1(int a, int b) 

void* func_ptr = &func_1;

那麼上面的寫法實際上可以寫成使用bind的

#include #include bool func_1(int a, int b) 

auto func_ptr = std::bind(func_1,std::placeholders::_1, std::placeholders::_2);

我們想想其實上面使用bind和函式指標是沒有什麼區別的。但是如果在物件導向的程式設計中,我們使用函式指標就會遇到麻煩。

比如乙個函式在類裡面,那就是成員函式,而成員函式都是屬於某個例項的,如何處理這個this問題,處理成函式指標時,##### 我們可以加上static關鍵字給這個函式。

但是有了bind就不一樣了。我們可以將this作為引數傳入。其實這個也很簡單,如果使用過std::thread的人都會看到樣大**,如果使用類的成員函式建立新執行緒就會傳入乙個this指標。

說白了,就是要說明,你這個函式到底是那個this指標的函式。

傳入this指標至少也分兩種,類內使用和類外使用。

2.1 類內使用

auto fun_ptr = std::bind(&類名::函式名,this, _1, _2);
2.2 類外使用
a a; // class a

auto fun_ptr = std::bind(&類名::函式名, &a, _1, _2);

這裡如何理解bind和this呢,其實大家如果知道原型模式,甚至更簡單的複製建構函式,明白這個就簡單。this就是this。

bool needcopy(int x) 

void usebinddemo4()

vectord;

transform(myset.begin(), myset.end(), back_inserter(d),needcopy);

}

這裡我們發現,這拷貝進去的是 0 1 啊,不是我們想要的啊。那我們應該修改啊。自己嘗試下吧。

void uselambda() 

vectord;

transform(myset.begin(), myset.end(), back_inserter(d),

(int x) );

}

3.1 lambda函式[=] [&]

這個很簡單

[=] 是值拷貝,就是如果使用到當前環境中的變數,就是值拷貝。什麼叫值拷貝。

這個剛學習c的函式就有

void add(int a) 

int main()

a不會因為呼叫add函式就改變自身在main中的值。

而[&]就是引用拷貝,顧名思義,就是用的資料本身。

什麼時候會用到{}這種函式呢,就是不想建立新的函式或者這個函式比較簡單。

舉個不想建立的新的函式的例子。

比如你寫得某個函式只會用到一次,你就不應該想著把這個單獨隔離成乙個函式。

在比如說這個函式就只有幾行**,比如重寫sort函式時,我想比較兩個值的大小讓後按照從小到大的順序排列。

sort(a.begin(), a.end(), (int b, int c) );

內建函式filter 和匿名函式lambda解析

一.內建函式filter filter 函式是 python 內建的乙個高階函式,filter 函式接收乙個函式 f 和乙個list,這個函式 f 的作用是對每個元素進行判斷,返回由符合條件迭代器 python3以下版本返回是列表 語法 filter function or none,iterabl...

js深入之call apply和bind模擬實現

var foo function fn fn.call foo 1注意 1 call改變了this的指向,指到foo 2 fn函式執行 即可將上面的 改變成下面這種形式 var foo foo.fn 1即將fn作為物件foo的屬性,然後進行呼叫。則可總結出模擬實現的步驟 1 將函式設定為物件的屬性,...

python 仿函式 C 仿函式

c 的標準庫stl裡面有6大部件,其中之一為仿函式。初始看到這一名字可能讓人摸不著頭腦 函式倒是挺容易理解,何故又起個仿函式的名字呢?本文將帶你揭開它看起來挺讓人迷惑但是實際上很簡單的面紗。仿函式,看名字就知道它肯定和函式有什麼關聯,但是也肯定和函式有什麼區別。函式主要是一塊接收輸入引數然後按照一定...