unaryPred函式物件,函式介面卡 一

2021-07-06 08:27:23 字數 2824 閱讀 1745

在學習到《essential c++》3.6節時自己按照自己的想法來實現書上提到的思路。**雖然簡單,不過自己卻發現有很多其他地方不熟悉,比如函式指標的用法,仿函式和函式介面卡的使用。搗鼓了半天,總算懂了點眉目,簡單總結下以備忘。

文件按照五部分分寫,先依次簡單地介紹find()與find_if()演算法、函式指標用法、仿函式(functon object)和函式介面卡(function adapters)。最後貼上自己實驗的**並簡單分析。

一、因為問題起於泛型搜尋演算法find_if(),所以先總結下有關find()和find_if()。 宣告:

inputiterator

find (inputiterator beg, inputiterator end, const t& value)

inputiterator

find_if(inputiterator beg, inputiterator end, unarypredicate op)

第一種形式返回在搜尋域[beg,end)內與value值相等的元素的位址;

第二種形式返回在搜尋域[beg,end)內滿足一元謂詞函式op(elem)為真的元素的位址。

1) 以上兩種形式在搜尋不到匹配元素的情況下均返回end;

2) 注意op函式呼叫期間不能夠改變自身的狀態;

3) op不能更改傳遞進來的引數;

二、為了增強泛型演算法的靈活性,一些泛型演算法允許傳遞使用者自定的的函式。泛型演算法在使用輔助函式時有不同的方式,有些是可以省略的,即演算法是可以不用給定的函式,而有些是強制性的,即必須使用這些函式。如下         

// code snippet

void print (int elem)

……for_each (coll.begin(), coll.end(), print);

一種特殊的輔助函式便是謂詞函式,謂詞函式通常指的是返回值為boolean的函式,它們通常用來為排序或者搜尋演算法指定參照條件。在使用中謂詞函式可分為帶有乙個引數的謂詞函式(unary)和需要兩個引數的謂詞函式(binary),值得注意的是並不是所有返回值為boolean型別的函式都是合法的謂詞函式。

三、仿函式是一種物件,但它具有函式一樣的功能,並且比函式更有優勢。其中一點便是效率更高。我們使用的仿函式通常被宣告為inline,所以其大部分執行邏輯在編譯時已經基本確定,因而少掉了頻繁呼叫函式的開銷。可以自己定義簡單的仿函式,如下: // code snippet

class print

};……

for_each (coll.begin(), coll.end(), print());

……c++的stl中提供了多種預定義的仿函式,如negate(), plus(), minus(), multiplies(), divides(), modulus(), equal_to(), not_equal_to(), less(), greater(), less_equal(), greater_equal(), logical_not(), logical_and(), logical_or().

四、函式介面卡也是一種仿函式,不過這種仿函式更為高等,因為它可以將乙個仿函式與另乙個仿函式/ 值/ 特殊的函式結合起來。

不難發現,stl常使用的仿函式雖然提供了多種有用的仿函式,然而這些仿函式均是通過迭代器對容器裡面的元素進行操作,但是有時候你還需要用其他的值結合,這時候便可以使用函式介面卡(見下面的例子)。

編譯不能通過的**如下所示: // code snippet

#include

#include

#include

#include

using namespace std;

bool less_than(int a, int b)

vectorfilter(const vector&vec, int filter_value, bool (*ptr_func)(int, int))

return temp;

}void display(vector&vec)

int main()

;vectorvec(int_arr, int_arr+nsize);

display(vec);

vectorresult;

result = filter(vec, 6, less_than);

display(result);

return 0;        

}可見,我在使用find_if()函式的時候,將裡面本應該為「函式指標」的第三個引數寫成了對這個函式的「函式呼叫」,這是不允許的。但整個程式的思路並沒有錯,因為上面的**可以通過仿函式來解決的。

上面也提到,一般通用的仿函式僅是對容器裡面的值進行處理,但本例的思路是需要將容器裡面的每個值以此與另乙個值val進行比較的。所以必須要使用到函式介面卡來將乙個仿函式與乙個值進行繫結。如下是更正後的**: // code snippet

#include

#include

#include

#include

using namespace std;

bool less_than(int a, int b)

vectorfilter(const vector&vec, int val, less<)

return nvec;

}void display(vector&vec)

int main()

;vectorvec(int_arr, int_arr+nsize);

display(vec);

vectorresult;

result = filter(vec, 6, less());

display(result);

return 0;        }

函式物件 函式符

函式物件 函式符 很多stl演算法都使用函式物件,也叫函式符 functor 函式符是以函式方式與 結合使用的任意物件,如函式名 指向函式的指標 過載了 運算子的類物件 函式符概念 1.生成器 generator 是不用引數就可以呼叫的函式符 2.一元函式 unary function 是用乙個引數...

STL 函式物件 謂詞 預定義函式物件 函式介面卡

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

函式指標和函式物件

函式指標分為全域性函式指標和類成員函式指標.函式指標型別為全域性函式.include stdafx.h using namespace std class testaction typedef void fp int void drink int i void eat int i class tes...