C 中定義比較函式的三種方法

2021-07-01 19:09:48 字數 2970 閱讀 4339

**

c++程式設計優與pascal的原因之一是c++中存在stl(標準模板庫)。stl存在很多有用的方法。

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

c++模板庫的許多容器需要相關型別有序,例如set和priority_queue。

這篇文章旨在告訴大家如何為乙個類定義乙個排序方法,以便在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. 定義 < 操作符。

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

1

2

3

4

structedge

;

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

1

2

3

4

5

6

7

8

structedge

};

你定義的方法必須按照如下方法宣告:

bool

operator

< (t other) const

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

std::set 的比較函式是使用 std::less 對使用者提供的型別的包裝 .而less的宣告:bool std::less<_ty>::operator ()(const _ty &,const _ty &) const

因此,必須宣告為const函式。確保左運算元也是const型別的。

1

2

3

4

5

6

7

8

structedge

};

stl的pair就具有與生俱來的排序能力。兩個pair物件的比較這樣的:先比較第乙個引數,如果第乙個引數相同再比較第二個引數。

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

2. 自定義排序方法。

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

a.比較內建型別

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

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

簡單來說,乙個比較方法接收兩個同型別的物件作為引數並且返回乙個bool值,原型如下:

1

boolname(t a,t b);

3. 過載()操作符

我們可以將比較函式作為stl容器建構函式的第乙個引數,並且把函式型別作為模板引數。例如:

1

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

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

我們需要定義乙個新的類並過載()操作符。

vectoroccurrences; 

struct

cmp

};

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

1

2

3

set<int, cmp> s;

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

stl也有一些內建的仿函式,例如less,greater等。

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

1

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

關於C 中定義比較函式的三種方法小結

c 程式設計優與pascal的原因之一是c 中存在stl 標準模板庫 stl存在很多有用的方法。c 模板庫中的許多方法都需要程式設計客棧相關引數有序,例如sort 顯然,如果你想對乙個集合進行排序,你必須要知道集合中的物件,那個在前那個在後。因此,學會如何定義比較方法是非常重要的。c 模板庫的許多容...

c 比較時間的三種方法

1。比較時間大小的實驗 string st1 12 13 string st2 14 14 datetime dt1 convert.todatetime st1 datetime dt2 convert.todatetime st2 datetime dt3 datetime.now if dat...

javascript定義函式的三種方法

function fn fn varf newfunction a b alert a b f a b 其實相當於如下 functionf a,b varzhenn function zhenn 其中用 function語句 和使用 函式直接量 來定義函式的方法似乎比較常見,也比較好理解,在此不多說...