国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

關于C++中定義比較函數的三種方法小結

2020-05-23 13:59:43
字體:
來源:轉載
供稿:網友

C++編程優與Pascal的原因之一是C++中存在STL(標準模板庫)。STL存在很多有用的方法。

C++模板庫中的許多方法都需要相關參數有序,例如Sort()。顯然,如果你想對一個集合進行排序,你必須要知道集合中的對象,那個在前那個在后。因此,學會如何定義比較方法是非常重要的。

C++模板庫的許多容器需要相關類型有序,例如set<T> 和priority_queue<T>。

這篇文章旨在告訴大家如何為一個類定義一個排序方法,以便在STL容器或者方法中使用。 作為一個C++程序員,你應該知道這些方法。

如何定義排序?

簡而言之,為一個類定義排序,我們就可以知道類的任意兩個對象在排序的過程中誰在前誰在后。我們可以用一個方法來實現,這個方法返回一個bool值表示誰排在前面。顯然,我們希望實現一個類似,f(x,y),這種形式的方法。它接收同一類型的對象作為兩個參數,返回值則表明誰會出現在誰前面。

嚴格弱序化

幾乎所有的方法或容器都需要排序來滿足數學意義上的標準嚴格弱序化,否則這些方法或容器的行為將不可預知。

假設f(x,y)是一個比較函數。 如果該函數滿足如下條件則它是嚴格弱序化的。

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;

看上去有點暈乎,不過不用擔心,只要你的比較方法能夠滿足對相等元素永遠返回false,那你的方法就滿足要求了。

三種實現方式:

1. 定義 < 操作符。

 使用這種方法可以使我們自定義的類能夠獲得與生俱來的排序能力。例如,如果有如下類:

struct Edge{int from,to ,weight;};

因為要實現Kruskai算法,你希望圖中的所有邊依據權重按降序排列。 像這樣來定義 operator<:

struct Edge{    int from,to ,weight;    bool operator <(Edge other) const    {        return weight>other.weight;    }   };  

你定義的方法必須按照如下方法聲明:

bool operator< (T other) const

注意: const關鍵字是必須的。

如果你不喜歡這種方式,比如,明明是要比較兩個對象,方法卻只有一個參數。你可以選擇如下方式:

 

struct Edge{  int from,to weight;  friend bool operator<(Edge a,Edge b)  {    return a.weight>b.weight;  }};

STL的pair<T1,T2>就具有與生俱來的排序能力。兩個pair對象的比較這樣的:先比較第一個參數,如果第一個參數相同再比較第二個參數。

所有內置類型都具有與生俱來的排序能力,這是由編譯器賦予的。

2. 自定義排序方法。

使用這種方式常常用在如下情形:

a.比較內置類型

b.不能修改需要比較的類型

c.除了類型自定義的比較方式以外的比較方法

簡單來說,一個比較方法接收兩個同類型的對象作為參數并且返回一個bool值,原型如下:

bool name(T a,T b);
 
3. 重載()操作符

我們可以將比較函數作為STL容器構造函數的第一個參數,并且把函數類型作為模板參數。例如:

set<int,bool (*)(int,int)> s(cmp);

這樣做或多或少會讓人費解。那我們就來看看如何使用仿函數來消除你的疑惑吧。

我們需要定義一個新的類并重載()操作符。

vector<int> occurrences; struct cmp {   bool operator()(int a, int b)   {     return occurrences[a] < occurrences[b];  } };

現在我們就可以把這個類作為模板參數傳遞給STL容器了。

set<int, cmp> s; priority_queue<int, vector<int>, cmp> pq;

STL也有一些內置的仿函數,例如less<T>,greater<T>等。

仿函數可以通過初始化然后像普通函數一樣使用。最簡單的就是在仿函數后面加上()。

sort(data.begin(), data.end(), greater<int>());

以上就是小編為大家帶來的關于C++中定義比較函數的三種方法小結全部內容了,希望大家多多支持VEVB武林網~


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 安达市| 阿城市| 宣武区| 内丘县| 赣州市| 浮山县| 抚顺县| 兴文县| 台南市| 五峰| 汉寿县| 皋兰县| 梨树县| 志丹县| 银川市| 大安市| 万山特区| 白河县| 吴川市| 鄂托克前旗| 政和县| 靖州| 巫溪县| 浑源县| 柳州市| 宜春市| 中超| 东明县| 昌都县| 文水县| 阳谷县| 独山县| 芦山县| 北流市| 双峰县| 隆回县| 乃东县| 宁陕县| 宝兴县| 宿迁市| 连江县|