c++的標準庫stl裡面有6大部件,其中之一為仿函式。初始看到這一名字可能讓人摸不著頭腦:函式倒是挺容易理解,何故又起個仿函式的名字呢?本文將帶你揭開它看起來挺讓人迷惑但是實際上很簡單的面紗。
仿函式,看名字就知道它肯定和函式有什麼關聯,但是也肯定和函式有什麼區別。函式主要是一塊接收輸入引數然後按照一定邏輯組織起來計算輸出引數的過程(這裡把print之類的也稱為輸出引數,只不過是輸出到螢幕上或者檔案中),簡而言之就是乙個執行特定功能的**塊。仿函式也是執行特定功能的**塊,但是與函式不同的是,仿函式寫的形式看起來有一些不一樣。下面看乙個簡單例子:
1 template
2 structplus6 }
這段**的主要功能是實現乙個加的功能,從名字也可以輕易地看出來。從**的具體結構看,仿函式寫了乙個類,這個類的名字叫plus,類中僅有乙個operator()的實現。目前為止仿函式看起來雖然挺簡單,但是好像沒啥用啊!!官人別急,馬上就上菜了。
介紹仿函式的用途之前,有必要介紹一下無名物件。
在c++中無名物件是非常常見的,不過很多時候我們並不會注意到它的存在,例如下面乙個例子:
intlen(std::stringstr)
這裡我們僅僅是加了乙個按引用傳遞的符號,這時再呼叫len(str),過程就應該不一樣了。如果各位看官想要測試,可以重寫一下new方法:
1 void* operator new(size_t size){2 std::cout<
這時一旦有new方法被呼叫,則我們就可以看到輸出資訊,說明進行了記憶體的申請操作,具體測試請各位大爺自行測試。
事實上,c++17標準增加了乙個string_view類,可以使用此類達到一些特定的string的引數傳遞作用,例如我們只是想要比較一下字串中部分字元,那麼使用string_view是不錯的選擇,再如我們都知道再使用vector容器時,可以使用.push_back()方法追加元素,也有乙個非常類似的方法:.emplace_back();實現的功能也是追加元素,不同之處在於push_back會建立乙個無名物件但是emplace_back不會,具體測試也請各位大爺利用上面寫的new方法進行測試。
囉嗦了一大堆,無名物件跟仿函式有什麼卵關係呢?
實際上仿函式最常用的也是無名物件的形式,舉個例子,再algorithm標頭檔案中,有乙個經常用到的方法叫做sort,該方法預設功能是給指定容器的元素按照從小到大的順序排序,那麼問題來了,如果我們想要從大到小排序呢?或者對於矩陣我們想要不按第一列,而是按照某一列排序呢?這時仿函式就可以發揮作用了。對於上述的問題,通常程式大爺的解決方法是寫乙個lamda函式(不知道的大爺喝口雪碧)或者自己寫一下cmp方法作為sort函式的第三個引數,實際上這一cmp方法也可以用仿函式試現。
以上拿sort方法舉例了,實際上,其他方法也完全可以使用,或者我們再寫東西的時候,也可以寫自己的仿函式。下面舉乙個純粹使用仿函式的例子:
1 intmain(){2 plusp;3 std::cout<
(2,3)<<:endl>
講到這裡應該比較清楚了吧各位大爺?
仿函式 C 中仿函式的應用
仿函式 c 中仿函式的應用 在使用仿函式的時候,主要用到以下兩種 一種是以基類std unary function派生出來的派生類 另一種是以基類std binary function派生出來的派生類。而這兩種有什麼區別呢?它們之間的區別只是第一種接收的引數個數為乙個,而第二種接收的引數的個數為兩個...
C 函式物件 仿函式
概念 模仿函式的類,使用方式如同函式 本質 函式物件是乙個類,類中對小括號 進行了函式過載。仿函式主要用於stl中的演算法中,函式指標雖然也可以作為演算法的引數,但它不能滿足stl對抽象性的要求,也不能滿足軟體積木的要求 函式指標無法和stl其他元件搭配,產生更靈活變化。案例 如下 include ...
C 之仿函式
一 仿函式 仿函式說白了就是類中過載 函式運算子,就可以把類物件當成乙個函式來使用 先舉個例子 class pow int main 結果如下圖 可以看到類中過載了 就可以pow類的物件當成函式一樣來使用。一 仿函式的應用 仿函式主要應用於stl和模板,這裡舉個stl的例子 class cmp in...