C 學習 仿函式 functors

2021-06-14 22:16:57 字數 1308 閱讀 6178

仿函式,也稱函式物件, 其實就是過載了括號運算子()的物件, 不過可以具有函式的一些性質, 可以在需要函式的地方(主要是各種容器和演算法)使用.

一,仿函式的優點:

1,可以擁有狀態, 可以在執行時動態地改變行為

3,速度更快, (其實快不了多少)

二,性質及應用

1, 主要應用在map等容器的建構函式和各種stl演算法上

2,預設情況下是傳值引用的, 也就是說仿函式的狀態不會因演算法而改變

3,如果需要傳引用 需要顯示宣告,例如:

generate_n(back_inserter(coll),4,functor);    //傳值

generate_n>,int,functor&>(back_inserter(coll),4,functor)   //傳引用

4,for_each演算法可以返回仿函式,所以無需這麼麻煩

5, c++預定義了幾種仿函式,包括 加減乘除,取模, >,<, <=, >=, ==,!=, 邏輯或,且,非,  所有容器或演算法預設的仿函式都是小於 less

三,函式配接器

函式配接器用來組合各種仿函式, 通過一系列複雜的語法,你可以獲得如下能力:

1,獲得不同引數的仿函式

2,使仿函式體現出不同的性質,如相反等

3,組合多個仿函式

4,將類成員函式包裝成仿函式

5,將普通函式包裝秤仿函式

事實上, 函式配接器的功能都可以通過寫乙個函式來實現,  而函式配接器過於複雜,會使**晦澀難懂,並且很可能因為其複雜的性質引入莫名其妙的錯誤

寫乙個簡單直接的實現往往比那些看似功能更強大,更通用的實現更為有效,  搞定產品的需求才是碼農的工作,**上的奇思妙想只是業餘愛好

四,運算子過載

c++提供了功能非常多的運算子過載功能,仿函式本身是乙個括號運算子過載,  但這些過載更多地是被基礎類庫的編寫者所用,對於普通碼農一般用的不多

1, 過載運算子只需要保證引數的數量與內建操作符一致, 對於引數型別, 傳引用/傳值, const與否不做要求.

2, 運算子的優先順序是固定的,並且過載後可能不再具備短路求值等特性

3,,運算子可以過載為類成員函式或普通函式, 一般來說,返回乙個新值的運算子,例如加法運算子+,通常定義為普通函式, 返回本身引用的運算子,例如 +=,通常定義為成員函式.  賦值運算子只能定義為成員函式.

4,如果定義為普通函式, 而且運算子又需要訪問私有成員, 需要在類中宣告為友元函式. 典型的如輸入運算子》和輸出運算子<<

5,關係運算子: 定義了乙個運算子並不能自動擴充套件為與之關聯的其他運算子,例如你定義了小於<, 還是不能使用》或》=.  

c 學習 函式物件(仿函式)

過載函式呼叫操作符 的類,其物件常稱為函式物件 function object 即它們是行為類似函式的物件,也叫仿函式 functor 其實就是過載 操作符,使得類物件可以像函式那樣呼叫。注 1 函式物件 仿函式 是乙個類,不是乙個函式 2 函式物件 仿函式 過載了 操作符使得它可以像函式一樣呼叫。...

python 仿函式 C 仿函式

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

C 學習筆記 (函式物件(仿函式))

先考慮乙個簡單的例子 假設有乙個vector,你的任務是統計長度小於5的string的個數,如果使用count if函式的話,你的 可能長成這樣 bool lengthislessthanfive const string str int res count if vec.begin vec.end...