STL源碼剖析 仿函數

  • 仿函數 也叫函數對象
  • 1,具有函數性質的對象;2,這種東西在調用者可以像函數一樣地被調用(調用),在被調用者則以對象所定義的function call operator扮 演函數的實質角色。
  • 要將某種 “操作”當做算法的參數,唯一辦法就是先將該"操作” (可能擁有數條以上的指令)設計為一個函數,再將函數指針當做算法的一個參數;或是將該“操作”設計為一個所謂的仿函數(就語言層面而言是個class), 再以該 仿函數產生一個對象,并以此對象作為算法的一個參數.
  • 根據以上陳述,既然函數指針可以達到“將整組操作當做算法的參數”,那又何必有所謂的仿函數呢?原因在于函數指針畢竟不能滿足STL對抽象性的要求,也不能滿足軟件積木的要求—— 函數指針無法和STL其它組件(如配接器adapter, 第8 章)搭配,產生更靈活的變化
  • 就實現觀點而言,仿函數其實上就是一個“行為類似函數”的對象。為了能夠“行為類似函數”,其類別定義中必須自定義(或說改寫、重載)function call運算 子 (operator()? 語法和語意請參考1.9.6節).擁有這樣的運算子后,我們就 可以在仿函數的對象后面加上一對小括號以此調用仿函數所定義的 operator()

  • ?其中第一種用法比較為大家所熟悉,greater<int> i g 的意思是產生一個名為 i g 的對象,ig(4,6)則是調用其operator (),并給予兩個參數4,6。第二種用法中的greater<int> ()意思是產生一個臨時(無名的)對象,之后的(4,6)才 是指定兩個參數4,6。臨時對象的產生方式與生命周期,請參見192節。

  • ?S T L 仿函數的分類,若以操作數(operand)的個數劃分,可分為一元和二元 仿函數,若以功能劃分,可分為算術運算(Arithmetic)、關系運算(Rational)、 邏輯運算(Logical)三大類。任何應用程序欲使用S T L 內建的仿函數,都必須含入 <functional>頭文件, S G I 則將它們實際定義于<stl_function.h > 文件中。以下分別描述。

7.2 可 配 接 (Adaptable ) 的關鍵

  • 在 S T L 六大組件中,仿函數可說是體積最小、觀念最簡單、實現最容易的一個但是小兵也能立大功—— 它扮演一種"策略”2角色,可以讓S T L 算法有更靈活的演出。而更加靈活的關鍵,在于S T L 仿函數的可配接性(adaptability)。
  • 是的, S T L 仿函數應該有能力被函數配接器(function adapter,第 8 章)修飾,彼此像積木一樣地串接? 為了擁有配接能力,每一個仿函數必須定義自己的相應型別(associative types), 就像迭代器如果要融入整個S T L 大家庭,也必須依照 規定定義自己的5 個相應型別一樣。這些相應型別是為了讓配接器能夠取出,獲得仿函數的某些信息。相應型別都只是一些 typedef, 所有必要操作在編譯期就全部 完成了,對程序的執行效率沒有任何影響,不帶來任何額外負擔0

7.2.1 unary_function

  • unary_function用來呈現一元函數的參數型別和回返值型別。其定義非常簡單:

?7.2.2 bin ary—function

  • binary_function用來呈現二元函數的第一參數型別、第二參數型別,以及 回返值型別。其定義非常簡單:

?7.3 算術類 (Arithmetic ) 仿函數

  • STL內建的“算術類仿函數”,支持加法、減法、乘法、除法、模數(余數,modulus)和否定(negation)運算。除了 “否定”運算為一元運算,其它都是二 元運算。

?

  • ?一般而言不會有人在這么單純的情況下運用這些功能極其簡單的仿函數。仿函
    數的主要用途是為了搭配STL算法。例如以下式子表示要以遞增次序對vector iv進行排序:

#include <iostream>
#include <algorithm>
#include <iterator>
#include <set>
#include <vector>
#include <functional>int main(int argc,char* argv[]){std::equal_to<int>equal_to_obj{};std::not_equal_to<int>not_equal_to_obj{};std::greater<int>greater_obj{};std::greater_equal<int>greater_equal_obj{};std::less<int>less_obj{};std::less_equal<int>less_equal_obj{};//調用 創建的對象 旅行函數的功能std::cout << equal_to_obj(3,5) << std::endl;      //0std::cout << not_equal_to_obj(3,5) << std::endl;  //1std::cout << greater_obj(3,5) << std::endl;       //0std::cout << greater_equal_obj(3,5) << std::endl; //0std::cout << less_obj(3,5) << std::endl;          //1std::cout << less_equal_obj(3,5) << std::endl;    //1// 以下直接以仿函數的臨時對象履行函數功能// 語法分析:functor<T>()是一個臨時對象,后面再接一對小括號// 意指調用 function call operatorstd::cout << std::equal_to<int>()(3,5) << std::endl;std::cout << std::not_equal_to<int>()(3,5) << std::endl;std::cout << std::greater_equal<int>()(3,5) << std::endl;std::cout << std::greater_equal<int>()(3,5) << std::endl;std::cout << std::less<int>()(3,5) << std::endl;std::cout << std::less_equal<int>()(3,5) << std::endl;return 0;
}

?7.5 邏 輯 運 算 類 (Logical)仿函數

#include <iostream>
#include <algorithm>
#include <iterator>
#include <set>
#include <vector>
#include <functional>int main(int argc,char* argv[]){std::logical_and<int>and_obj{};std::logical_or<int>or_obj{};std::logical_not<int>not_obj{};// 以下運用上述對象,履行函數功能std::cout << and_obj(true, true) << std::endl;std::cout << or_obj(true, false)<< std::endl;std::cout << not_obj(true) << std::endl;// 以下直接以仿函數的臨時對象履行函數功能// 語法分析: functor<T>() 是一個臨時對象,后面再接一對小括號// 意指調用 function call operatorstd::cout <<  << std::endl;std::cout <<  << std::endl;std::cout <<  << std::endl;return 0;
}

?7 .6 證同 ( id en tity ) 、 選 擇 (se le c t) 、 投 射 (project)

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/446426.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/446426.shtml
英文地址,請注明出處:http://en.pswp.cn/news/446426.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python學習6 字典基礎知識和常用函數

字典概念 字典是 Python 提供的一種常用的數據結構&#xff0c;它用于存放具有映射關系的數據。為了保存具有映射關系的數據&#xff0c;Python 提供了字典&#xff0c;字典相當于保存了兩組數據&#xff0c;其中一組數據是關鍵數據&#xff0c;被稱為 key&#xff1b;另一組數…

EndNote概述

概述 EndNote 是SCI&#xff08;Thomson Scientific 公司&#xff09;的官方軟件&#xff0c;支持國際期刊的參考文獻格式有3776 種&#xff0c;寫作模板幾百種&#xff0c;涵蓋各個領域的雜志。簡單來說EndNote的功能就是替你管理文獻&#xff0c;一鍵插入固定格式的參考文獻…

Java web后端2 Servlet Maven HttpServlet ServletConfig ServletContext HTTP協議

創建項目 新建項目 Java Enterprise JDK1.8 Web Application Tomcat JAVA 默認 過程需要聯網 Maven的配置 IDEA內置Maven 修改本地倉庫位置&#xff0c;因為以后會越來越大 替換配置文件&#xff1a; 阿里云鏡像下載 Servlet基礎 1.動態Web資源開發 2.Servlet是使用J…

STL源碼剖析 配接器

配接器(adapters)在 STL組件的靈活組合運用功能上&#xff0c;扮演著軸承、轉換器的角色。Adapter這個概念&#xff0c;事實上是一種設計模式(design pattern)。 Design Patterns)) 一書提到23個最普及的設計模式&#xff0c;其中對odopter樣式的定義如下&#xff1a;將 一個cl…

中科大 計算機網絡3 網絡邊緣Edge

網絡結構 邊緣系統 網絡核心 接入網 方塊&#xff1a;邊緣系統(主機) 圓的&#xff1a;網絡核心&#xff0c;數據交換作用 連接邊緣系統和網絡核心的叫做接入網&#xff08;access&#xff09;&#xff0c;把邊緣的主機接入到網絡核心&#xff08;所以是分布式的&#xff09; …

STL源碼剖析 入門開始 STL概論與版本簡介

源代碼之中時而會出現一些全局函數調用操作&#xff0c;尤其是定義于<stl_construct.h> 之中用于對象構造與析構的基本函數&#xff0c;以及定義于<stl_uninitialized.h>之 中 用 于 內 存 管 理 的 基 本 函 數 &#xff0c; 以及定義于<stl_algobase.h>之中…

中科大 計算機網絡4 網絡核心Core 分組交換 電路交換

網絡核心 電路交換&#xff08;線路交換&#xff09;&#xff1a;打電話之前&#xff0c;先建立一條鏈路&#xff08;物理&#xff09; 分組交換&#xff1a;存儲轉發的方式 電路交換&#xff08;線路交換&#xff09; 通過信令&#xff08;控制信息&#xff0c;如&#xf…

STL 源碼剖析 空間配置器

以STL的運用角度而言&#xff0c;空間配置器是最不需要介紹的東西&#xff0c;它總是隱藏在一切組件&#xff08;更具體地說是指容器&#xff0c;container&#xff09; 的背后但是STL的操作對象都存放在容器的內部&#xff0c;容器離不開內存空間的分配為什么不說allocator是內…

中科大 計算機網絡7 分組延遲 分組丟失 吞吐量

分組丟失和延遲的原因 隊列太長沒有意義&#xff0c;用戶需求 排隊&#xff1a;輸出能力<到來的分組&#xff0c;需要等待 四種分組延遲 節點處理延遲&#xff1a;確定的 排隊延遲&#xff1a;隨機&#xff0c;取決于網絡情況 一個比特的傳輸時間&#xff1a; R1Mbps …

STL源碼剖析 迭代器iterator的概念 和 traits編程技法

iterator模式定義如下&#xff1a;提供一種方法&#xff0c;使之能夠依序巡訪某個 聚合物(容器)所含的各個元素&#xff0c;而又無需暴露該聚合物的內部表述方式.STL的中心思想在于&#xff1a;將數據容器(containers)和算法(algorithms)分開&#xff0c;彼此獨立設計&#xff…

中科大 計算機網絡11 應用層原理

應用層大綱 傳輸層向應用層提供的服務&#xff0c;形式是Socket API&#xff08;原語&#xff09; 一些網絡應用的例子 互聯網層次中&#xff0c;應用層協議最多 流媒體應用&#xff1a;直播 網絡核心最高的層次就是網絡層 應用進程通信方式 C/S&#xff1a; 客戶端&…

STL源碼剖析 序列式容器 vector 和 ilist

Vector list 單向鏈表 ilistlist的刪除操作&#xff0c;也只有指向被刪除元素的迭代器會失效&#xff0c;其他迭代器不會受到影響

中科大 計算機網絡5 接入網和物理媒體

接入網 接入網&#xff1a;把邊緣&#xff08;主機&#xff09;接入核心&#xff08;路由器&#xff0c;交換機&#xff09; 骨干網【連接主機和主機】和接入網中都有物理媒體 接入方式&#xff1a;有線和無線 帶寬共享/獨享 接入網&#xff1a;住宅接入modem modem調制解調…

STL源碼剖析 序列式容器 deque雙端隊列

相較于vector的內存拷貝&#xff0c;deque在內存不足時只需要進行內存的拼接操作即可&#xff0c;不需要重新配置、復制、釋放等操作&#xff0c;代價就是迭代器的架構不是一個普通的指針&#xff0c;比較復雜d e q u e 的迭代器 deque是分段連續空間。維持其“整體連續”假象…

中科大 計算機網絡6 Internet結構和ISP

互聯網的結構 端系統通過接入ISPs接入互聯網 n個ISP互相連接&#xff1a; IXP,Internet exchage point:互聯網接入點&#xff0c;互聯網交互點 ISP&#xff1a;互聯網服務提供商&#xff0c;提供接入&#xff0c;提供網絡【中國移動&#xff0c;中國電信】 ICP&#xff1a…

STL源碼剖析 Stack棧 queue隊列

隨機迭代器用于隨機數據訪問&#xff0c;所以棧stack不具備此功能

中科大 計算機網絡8 協議層次和服務模型

協議層次 協議層次&#xff1a;現實生活中的例子 分層 分層處理和實現復雜系統 圖中&#xff0c;左邊是模塊&#xff0c;右邊是分層 計算機的設計是分層&#xff0c;每一層實現一個或一組功能&#xff0c;下層向上層提供服務&#xff1b;但效率比較低 對等層實體通過協議來交換…

STL源碼剖析 heap堆結構

heap一般特指max-heap&#xff0c;即最大的元素位于heap和array的首部 heap不提供遍歷功能&#xff0c;也不提供迭代功能

中科大 計算機網絡9 互聯網歷史

總綱 計算機網絡 早期1960以前 1961-1972 NCP協議&#xff1a;相當于現在的TCP和IP協議 每個節點即是數據的源也是數據的目標