亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2016年10月31日 13:53:23   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇關(guān)于C++中定義比較函數(shù)的三種方法小結(jié)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

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

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

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

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

如何定義排序?

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

嚴(yán)格弱序化

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

假設(shè)f(x,y)是一個(gè)比較函數(shù)。 如果該函數(shù)滿(mǎn)足如下條件則它是嚴(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)暈乎,不過(guò)不用擔(dān)心,只要你的比較方法能夠滿(mǎn)足對(duì)相等元素永遠(yuǎn)返回false,那你的方法就滿(mǎn)足要求了。

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

1. 定義 < 操作符。

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

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

因?yàn)橐獙?shí)現(xiàn)Kruskai算法,你希望圖中的所有邊依據(jù)權(quán)重按降序排列。 像這樣來(lái)定義 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>就具有與生俱來(lái)的排序能力。兩個(gè)pair對(duì)象的比較這樣的:先比較第一個(gè)參數(shù),如果第一個(gè)參數(shù)相同再比較第二個(gè)參數(shù)。

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

2. 自定義排序方法。

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

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

b.不能修改需要比較的類(lèi)型

c.除了類(lèi)型自定義的比較方式以外的比較方法

簡(jiǎn)單來(lái)說(shuō),一個(gè)比較方法接收兩個(gè)同類(lèi)型的對(duì)象作為參數(shù)并且返回一個(gè)bool值,原型如下:

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

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

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

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

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

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

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

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

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

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

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

以上就是小編為大家?guī)?lái)的關(guān)于C++中定義比較函數(shù)的三種方法小結(jié)全部?jī)?nèi)容了,希望大家多多支持腳本之家~

相關(guān)文章

  • 對(duì)比C語(yǔ)言中g(shù)etc()函數(shù)和ungetc()函數(shù)的使用

    對(duì)比C語(yǔ)言中g(shù)etc()函數(shù)和ungetc()函數(shù)的使用

    這篇文章主要介紹了對(duì)比C語(yǔ)言中g(shù)etc()函數(shù)和ungetc()函數(shù)的使用,是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-08-08
  • C++野指針的具體實(shí)現(xiàn)

    C++野指針的具體實(shí)現(xiàn)

    野指針就是指針指向的不是一個(gè)有效(合法)的地址,本文主要介紹了C++野指針的具體實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • Qt實(shí)現(xiàn)簡(jiǎn)單動(dòng)態(tài)時(shí)鐘

    Qt實(shí)現(xiàn)簡(jiǎn)單動(dòng)態(tài)時(shí)鐘

    這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)簡(jiǎn)單動(dòng)態(tài)時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • Opencv實(shí)現(xiàn)視頻播放與進(jìn)度控制

    Opencv實(shí)現(xiàn)視頻播放與進(jìn)度控制

    這篇文章主要為大家詳細(xì)介紹了Opencv實(shí)現(xiàn)視頻播放與進(jìn)度控制,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 詳解C語(yǔ)言實(shí)現(xiàn)猜數(shù)字游戲

    詳解C語(yǔ)言實(shí)現(xiàn)猜數(shù)字游戲

    這篇文章主要為大家介紹了C語(yǔ)言實(shí)現(xiàn)猜數(shù)字游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助<BR>
    2022-01-01
  • C語(yǔ)言改造通訊錄操作詳解

    C語(yǔ)言改造通訊錄操作詳解

    這篇文章主要介紹了C語(yǔ)言文件操作改造通訊錄方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-01-01
  • C++帶頭雙向循環(huán)鏈表超詳細(xì)解析

    C++帶頭雙向循環(huán)鏈表超詳細(xì)解析

    帶頭雙向循環(huán)鏈表:結(jié)構(gòu)最復(fù)雜,一般用在單獨(dú)存儲(chǔ)數(shù)據(jù)。實(shí)際中使用的鏈表數(shù)據(jù)結(jié)構(gòu),都是帶頭雙向循環(huán)鏈表。另外這個(gè)結(jié)構(gòu)雖然結(jié)構(gòu)復(fù)雜,但是使用代碼實(shí)現(xiàn)以后會(huì)發(fā)現(xiàn)結(jié)構(gòu)會(huì)帶來(lái)很多優(yōu)勢(shì),實(shí)現(xiàn)反而簡(jiǎn)單
    2022-03-03
  • Qt編寫(xiě)地圖綜合應(yīng)用之繪制覆蓋物折線(xiàn)

    Qt編寫(xiě)地圖綜合應(yīng)用之繪制覆蓋物折線(xiàn)

    折線(xiàn)圖目前應(yīng)用最廣的也是用來(lái)繪制各種軌跡,折線(xiàn)圖其實(shí)就是后面動(dòng)態(tài)軌跡圖、飛機(jī)航線(xiàn)圖的前身,公用的一個(gè)方法addPolyline。本文將教大家如何通過(guò)QT實(shí)現(xiàn)覆蓋物折線(xiàn)圖,快來(lái)學(xué)習(xí)吧
    2021-12-12
  • C語(yǔ)言之二叉樹(shù)的遍歷

    C語(yǔ)言之二叉樹(shù)的遍歷

    這篇文章主要介紹了C語(yǔ)言中二叉樹(shù)的遍歷:前序、中序、后序,認(rèn)識(shí)二叉樹(shù)結(jié)構(gòu)最簡(jiǎn)單的方式就是遍歷二叉樹(shù),感興趣的小伙伴可以參考閱讀本文
    2023-03-03
  • C++ vector容器 find erase的使用操作:查找并刪除指定元素

    C++ vector容器 find erase的使用操作:查找并刪除指定元素

    這篇文章主要介紹了C++ vector容器 find erase的使用操作:查找并刪除指定元素,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05

最新評(píng)論