stl中的仿函式functor的應用

2022-03-24 16:48:58 字數 1555 閱讀 1604

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 優點 函式物件超越了普通函式的概念,可以在內部儲存其狀態 比如呼叫次數 函式物件可以作為引數呼叫 ...