亚洲精品中文字幕无乱码_久久亚洲精品无码AV大片_最新国产免费Av网址_国产精品3级片

C語言

C++中定義比較函數(shù)的三種方法

時間:2024-10-10 15:12:12 C語言 我要投稿
  • 相關(guān)推薦

關(guān)于C++中定義比較函數(shù)的三種方法

  C++擅長面向?qū)ο蟪绦蛟O(shè)計的同時,還可以進(jìn)行基于過程的程序設(shè)計,因而C++就適應(yīng)的問題規(guī)模而論,大小由之。以下,小編為大家介紹關(guān)于C++中定義比較函數(shù)的三種方法,供大家參考借鑒,歡迎瀏覽!


  C++編程優(yōu)與Pascal的原因之一是C++中存在STL(標(biāo)準(zhǔn)模板庫)。STL存在很多有用的方法。

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

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

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

  如何定義排序?

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

  嚴(yán)格弱序化

  幾乎所有的方法或容器都需要排序來滿足數(shù)學(xué)意義上的標(biāo)準(zhǔn)嚴(yán)格弱序化,否則這些方法或容器的行為將不可預(yù)知。

  假設(shè)f(x,y)是一個比較函數(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)心,只要你的比較方法能夠滿足對相等元素永遠(yuǎn)返回false,那你的方法就滿足要求了。

  三種實現(xiàn)方式:

  1. 定義 < 操作符。

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

  struct Edge

  {

  int from,to ,weight;

  };

  因為要實現(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)鍵字是必須的。

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

  struct Edge

  {

  int from,to weight;

  friend bool operator<(Edge a,Edge b)

  {

  return a.weight>b.weight;

  }

  };

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

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

  2. 自定義排序方法。

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

  a.比較內(nèi)置類型

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

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

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

  bool name(T a,T b);

  3. 重載()操作符

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

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

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

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

  vector<int> occurrences;

  struct cmp

  {

  bool operator()(int a, int b)

  {

  return occurrences[a] < occurrences[b];

  }

  };

  現(xiàn)在我們就可以把這個類作為模板參數(shù)傳遞給STL容器了。

  set<int, cmp> s;

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

  STL也有一些內(nèi)置的仿函數(shù),例如less<T>,greater<T>等。

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

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


【C++中定義比較函數(shù)的三種方法】相關(guān)文章:

C++調(diào)用C函數(shù)的方法05-21

c和c++中實現(xiàn)函數(shù)回調(diào)的方法08-30

Java程序調(diào)用C/C++語言函數(shù)的方法07-31

C++函數(shù)考點(diǎn)歸納09-30

java中定義常量的方法及介紹08-27

C語言函數(shù)的定義07-13

C++如何調(diào)用matlab函數(shù)06-29

Excel中COUNTIF函數(shù)的使用方法08-21

excel中rank函數(shù)使用方法06-07

Excel中vlookup函數(shù)的使用方法08-27