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