探秘C 仿函式

2021-09-24 21:45:35 字數 1472 閱讀 3225

最近喵哥遇到乙個問題:如何在不借助額外空間(新建vector等)來實現map自己的想法(不只是表面的公升序、降序)排序(sort只適用於順序容器,map並不可以使用)。

如果忽略「不借助額外空間這個要求」,完全可以用乙個vector來實現:

#include #include #include #include #include #include #include bool secsort(pairconst x, pairconst y) 

int main()

仿函式(functors)在c++標準中採用的名稱是函式物件(function objects)。仿函式主要用於stl中的演算法中,雖然函式指標雖然也可以作為演算法的引數,但是函式指標不能滿足stl對抽象性的要求也不能滿足軟體積木的要求–函式指標無法和stl其他元件搭配,產生更靈活變化。仿函式本質就是類過載了乙個operator(),建立乙個行為類似函式的物件。

使用仿函式必須包含:標頭檔案。先看看stl的乙個仿函式,less<_ty>

templatestruct less

};

乍一看,挺麻煩的,其實只要抓住幾個要點就可以自定義仿函式了:

仿函式的類必須過載operator()運算子;過載operator()運算子時必須在函式宣告後面const,即是乙個常量成員函式,這是因為定義的類要跟binder2nd 一致,binder2nd 的 operator() 後面有個 const;

#include #include #include #include #include #include #include class secsort 

};int main()

上面**中的secsort就是乙個仿函式,在定義仿函式類的時候可以不表明繼承了binary_function與unary_function,其實在編譯的時候可以自動識別出,乙個現象就是:如果過載operator()時不是常量成員函式,那麼就會報錯。

上述仿函式實現的是:按照key(string型別)的長度大小排序。如果要實現按照value排序,可以直接在secsort類中把過載函式的引數改為int嗎?這是絕對不可以的,因為map預設是按照key值排序的。

事實上,stl中pair的排序方式決定了map的排序。

templateinline bool  

operator<(const pair<_t1, _t2>& __x, const pair<_t1, _t2>& __y)

stl原始碼中pair已經過載了《號,所以不可以在定義map的時候按照value排序,但是可以參照第一段**用vector實現按照value排序。

python 仿函式 C 仿函式

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

仿函式 C 中仿函式的應用

仿函式 c 中仿函式的應用 在使用仿函式的時候,主要用到以下兩種 一種是以基類std unary function派生出來的派生類 另一種是以基類std binary function派生出來的派生類。而這兩種有什麼區別呢?它們之間的區別只是第一種接收的引數個數為乙個,而第二種接收的引數的個數為兩個...

C 函式物件 仿函式

概念 模仿函式的類,使用方式如同函式 本質 函式物件是乙個類,類中對小括號 進行了函式過載。仿函式主要用於stl中的演算法中,函式指標雖然也可以作為演算法的引數,但它不能滿足stl對抽象性的要求,也不能滿足軟體積木的要求 函式指標無法和stl其他元件搭配,產生更靈活變化。案例 如下 include ...