stl中的仿函式functor的應用
在stl的泛型演算法中,functor應用甚多。
template struct plus};template struct minus
};void test()
在泛型演算法中,應用甚多的是後面的那種「匿名物件」,因為很多algorithm中,匿名物件的生命週期在演算法中,出了演算法後匿名物件銷毀。
舉例:
inner_product(iv.begin(), iv.end(), iv.begin(), 10, minus(), plus())
adjacent_difference(iv.begin(), iv.end(), oite, plus());
傳遞的都是functor的匿名物件。
functor,說白了就是對operator()的過載。
問:在c++中不能過載的符號是什麼?
大多數的運算子能夠被程式設計師過載。例外的是(4個):
. (點符號) :: ?: sizeof
(1) 理論上來說,.(點運算子)可以通過使用和->一樣的技術來進行過載。但是,這樣做會導致乙個問題,那就是無法確定操作的是過載了.的物件呢,還是通過.引用的乙個物件。例如:
class y ;class x
void f();
// ...
}; void g(x& x)
這個問題能夠用幾種不同的方法解決。在標準化的時候,哪種方法最好還沒有定論。
(2) 在 n::m 中,無論 n 還是 m 都不是值的表示式;n 和 m 是編譯器知道的名字,::執行乙個
(編譯期的)範圍解析,而不是表示式求值。你可以想象一下,允許過載 x::y的話,x 可能是乙個物件而不是乙個名字空間(namespace)或者乙個類,這樣就會導致——與原來的表現相反——產生新的語法(允許 表示式 1::表示式 2)。很明顯,這種複雜性不會帶來任何好處。
(3) 並沒有什麼根本的原因要禁止過載?:。僅僅是因為,我沒有發現有哪種特殊的情況需要過載乙個三元運算子。注意乙個過載了 表示式1?表示式2:表示式 3 的函式,不能夠保證表示式 2:表示式3中只有乙個會被執行。
(4) sizeof 不能夠被過載是因為內建的操作(built-in operations),諸如對乙個指向陣列的指標進行增量操作,必須依靠它。考慮一下:
x a[10];x* p = &a[3];
x* q = &a[3];
p++; // p指向a[4], 那麼p 的整型值必須比 q的整型值大出乙個 sizeof(x)
所以,sizeof(x)不能由程式設計師來賦予乙個不同的新意義,以免違反基本的語法。
更多的細節,請參見《c++語言的設計和演變》。
bjarne stroustrup faq:
C 仿函式 functor 詳解
所謂的仿函式 functor 是通過過載 運算子模擬函式形為的類。因此,這裡需要明確兩點 1 仿函式不是函式,它是個類 2 仿函式過載了 運算子,使得它的對你可以像函式那樣子呼叫 的形式好像是在呼叫 函式 看下面的例項 include using namespace std const int cm...
C 入門系列 仿函式 functor(精講)
來看仿函式的通俗定義 仿函式 functor 又稱為函式物件 function object 是乙個能行使函式功能的類。仿函式的語法幾乎和我們普通的函式呼叫一樣,不過作為仿函式的類,都必須過載operator 運算子。先考慮乙個應用防函式的簡單例子 假設有乙個vector,你的任務是統計長度小於5的...
STL之仿函式
這裡介紹仿函式,謂詞,內建函式物件,介面卡的用法 仿函式 又稱函式物件,實際上是過載操作符 其中不定義構造和析構函式 只有乙個引數是一元仿函式,兩個就是二元 eg class func intmain 優點 函式物件超越了普通函式的概念,可以在內部儲存其狀態 比如呼叫次數 函式物件可以作為引數呼叫 ...