C 中的 操作符過載及STL傳遞比較函式

2021-09-29 13:26:16 字數 1404 閱讀 9882

以下內容參考自 《stl原始碼剖析》

許多stl演算法都提供了兩個版本,乙個用於一般狀況(如排序時以遞增方式排列),另乙個用於特殊情況(如排序時由使用者指定以何種特殊關係進行排列)

過去c語言,如果想將函式當作引數傳遞,唯有通過函式指標才能達成,即將自定義規則、條件的函式的對應函式指標作為引數傳進來。

但是,函式指標有缺點,即它無法持有自己的狀態,也無法達到組建技術中的可適配性——即無法再將某些修飾條件加諸於其上而改變其狀態

stl演算法的特殊版本以仿函式的形式呈現。如果針對某個class進行operator()過載,它就成為乙個仿函式1

1、函式指標

bool cmp(const int& l, const int& r)

函式呼叫方法:priority_queueq(cmp);

典型c風格寫法,即上述所說的通過函式指標將函式作為引數進行傳遞

2、函式物件

template struct greater

};

函式呼叫方法:priority_queueq;

注意,這裡的q是採取預設構造。回顧之前的建構函式,欄位comp在預設建構函式是直接用預設構造的,所以這裡可以不寫引數,而對於函式指標則不同,函式指標不是類,沒有建構函式,所以必須添上引數

3、lambda表示式

auto comp = (const int& lhs, const int& rhs) ;

priority_queue, decltype(comp)> q(comp);

由於lambda表示式型別要無法手寫出來,所以c++ 11提供了decltype關鍵字來取得型別

針對於上述內容進行補充。 對於prioriity_queue,stl中其本身預設為大根堆,採用less函式進行比較

template< class t ,

class sequence=vector,

classcompare=less> (要乙個空格,否則編譯器會當做右移操作符,報錯)

class priority_queue;

所以,可以根據其在自定義物件,如point類別中,直接過載操作符<,

class point

};

注意,對於《操作符,因為定義的類內函式,即使用this指標指向的當前物件和傳入物件進行比較

c 中 操作符過載

操作符過載 1.有先後順序,如 t3 t1 t2 則t1 t2等價於t1.operate t2 2.對 操作符進行過載時,如aa是有本質區別的。操作符過載就是用函式的方法對乙個操作符進行重新定義,在該函式中定義了操作符所要完成的功能。其中cout是輸出流ostream中的物件 元素 3.a cout...

C 中 操作符過載

在實際程式中遇到一操作符問題,記錄下來方便以後查詢。在寫hashtable資料結構中,遇到操作符過載問題,具體需求如下 1.a x b 如果a x 為空,則新增記錄 2.b a x 如果a x 為空,則提示出錯 對操作符過載之後發現根本不能解決問題,查詢一些資料後發現該問題為過載後的讀寫問題,乙個過...

c 中過載《操作符

在類定義中,有時候我們需要直接利用cout來列印出類中的資料,此刻就需要過載 操作符來實現 假定定義了乙個類time 然後宣告了乙個類 time a cout 這樣的語法肯定是會報錯的,此刻就需要過載operator 要怎麼做呢?首先,在過載函式中,要訪問到類time中的私有成員的資料,所以我們需要...