關(guān)于C++中定義比較函數(shù)的三種方法小結(jié)
C++編程優(yōu)與Pascal的原因之一是C++中存在STL(標(biāo)準(zhǔn)模板庫)。STL存在很多有用的方法。
C++模板庫中的許多方法都需要相關(guān)參數(shù)有序,例如Sort()。顯然,如果你想對(duì)一個(gè)集合進(jìn)行排序,你必須要知道集合中的對(duì)象,那個(gè)在前那個(gè)在后。因此,學(xué)會(huì)如何定義比較方法是非常重要的。
C++模板庫的許多容器需要相關(guān)類型有序,例如set<T> 和priority_queue<T>。
這篇文章旨在告訴大家如何為一個(gè)類定義一個(gè)排序方法,以便在STL容器或者方法中使用。 作為一個(gè)C++程序員,你應(yīng)該知道這些方法。
如何定義排序?
簡(jiǎn)而言之,為一個(gè)類定義排序,我們就可以知道類的任意兩個(gè)對(duì)象在排序的過程中誰在前誰在后。我們可以用一個(gè)方法來實(shí)現(xiàn),這個(gè)方法返回一個(gè)bool值表示誰排在前面。顯然,我們希望實(shí)現(xiàn)一個(gè)類似,f(x,y),這種形式的方法。它接收同一類型的對(duì)象作為兩個(gè)參數(shù),返回值則表明誰會(huì)出現(xiàn)在誰前面。
嚴(yán)格弱序化
幾乎所有的方法或容器都需要排序來滿足數(shù)學(xué)意義上的標(biāo)準(zhǔn)嚴(yán)格弱序化,否則這些方法或容器的行為將不可預(yù)知。
假設(shè)f(x,y)是一個(gè)比較函數(shù)。 如果該函數(shù)滿足如下條件則它是嚴(yán)格弱序化的。
1.f(x,x) = false;
2. if f(x,y) then !f(y,x)
3.if f(x,y) and f(y,z) then f(x,z)
4. if !f(x,y)&&!f(y,x) then x==y; if x==y and y==z then x==z;
看上去有點(diǎn)暈乎,不過不用擔(dān)心,只要你的比較方法能夠滿足對(duì)相等元素永遠(yuǎn)返回false,那你的方法就滿足要求了。
三種實(shí)現(xiàn)方式:
1. 定義 < 操作符。
使用這種方法可以使我們自定義的類能夠獲得與生俱來的排序能力。例如,如果有如下類:
struct Edge { int from,to ,weight; };
因?yàn)橐獙?shí)現(xiàn)Kruskai算法,你希望圖中的所有邊依據(jù)權(quán)重按降序排列。 像這樣來定義 operator<:
struct Edge { int from,to ,weight; bool operator <(Edge other) const { return weight>other.weight; } };
你定義的方法必須按照如下方法聲明:
bool operator< (T other) const
注意: const關(guān)鍵字是必須的。
如果你不喜歡這種方式,比如,明明是要比較兩個(gè)對(duì)象,方法卻只有一個(gè)參數(shù)。你可以選擇如下方式:
struct Edge { int from,to weight; friend bool operator<(Edge a,Edge b) { return a.weight>b.weight; } };
STL的pair<T1,T2>就具有與生俱來的排序能力。兩個(gè)pair對(duì)象的比較這樣的:先比較第一個(gè)參數(shù),如果第一個(gè)參數(shù)相同再比較第二個(gè)參數(shù)。
所有內(nèi)置類型都具有與生俱來的排序能力,這是由編譯器賦予的。
2. 自定義排序方法。
使用這種方式常常用在如下情形:
a.比較內(nèi)置類型
b.不能修改需要比較的類型
c.除了類型自定義的比較方式以外的比較方法
簡(jiǎn)單來說,一個(gè)比較方法接收兩個(gè)同類型的對(duì)象作為參數(shù)并且返回一個(gè)bool值,原型如下:
bool name(T a,T b);
3. 重載()操作符
我們可以將比較函數(shù)作為STL容器構(gòu)造函數(shù)的第一個(gè)參數(shù),并且把函數(shù)類型作為模板參數(shù)。例如:
set<int,bool (*)(int,int)> s(cmp);
這樣做或多或少會(huì)讓人費(fèi)解。那我們就來看看如何使用仿函數(shù)來消除你的疑惑吧。
我們需要定義一個(gè)新的類并重載()操作符。
vector<int> occurrences; struct cmp { bool operator()(int a, int b) { return occurrences[a] < occurrences[b]; } };
現(xiàn)在我們就可以把這個(gè)類作為模板參數(shù)傳遞給STL容器了。
set<int, cmp> s; priority_queue<int, vector<int>, cmp> pq;
STL也有一些內(nèi)置的仿函數(shù),例如less<T>,greater<T>等。
仿函數(shù)可以通過初始化然后像普通函數(shù)一樣使用。最簡(jiǎn)單的就是在仿函數(shù)后面加上()。
sort(data.begin(), data.end(), greater<int>());
以上就是小編為大家?guī)淼年P(guān)于C++中定義比較函數(shù)的三種方法小結(jié)全部?jī)?nèi)容了,希望大家多多支持我們~
欄 目:C語言
下一篇:VC獲取當(dāng)前路徑及程序名的實(shí)現(xiàn)代碼
本文標(biāo)題:關(guān)于C++中定義比較函數(shù)的三種方法小結(jié)
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/1981.html
您可能感興趣的文章
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)數(shù)怎么表達(dá)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10APUE筆記之:進(jìn)程環(huán)境詳解
- 01-10c++中inline的用法分析
- 01-10如何尋找數(shù)組中的第二大數(shù)


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 04-02jquery與jsp,用jquery