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

2021-09-19 03:12:20 字數 4917 閱讀 1392

參考自:3 ways to define comparison functions in c++

stl裡有不少東西需要比較函式,例如 sort(),set,priority_queue。

下面我們提供三種比較函式。

1、定義 operator<():

使用該方法的前提是有預設的比較函式會呼叫我們的 operator<()。

比如我們有如下類,那麼我們可以這樣定義 operator<。

struct

edge;bool

operator

<(edge a, edge b)

這樣,我們就有了下面的例子。

#include

#include

#include

#include

#include

using

namespace

std;struct

edge};bool

operator

<(edge a, edge b)int

main

() vector

vec; vec.push_back(edge(0, 1, 7)); vec.push_back(edge(1, 2, 4)); vec.push_back(edge(2, 3, 10)); vec.push_back(edge(3, 4, 5)); sort(vec.begin(), vec.end()); //sort()函式預設為增序,這裡反轉為降序。

for(int i = 0; i < vec.size(); ++i)  set

se; set

::iterator iter; se.insert(edge(0, 1, 7)); se.insert(edge(1, 2, 4)); se.insert(edge(2, 3, 10)); se.insert(edge(3, 4, 5));      //set預設為增序,這裡反轉為降序。

for(iter = se.begin(); iter != se.end(); ++iter)   return

0;}

對應的輸出為:

457

101075

41075

4

2、定義乙個普通的比較函式:

還是用前面的設定:

struct

edge;bool

cmp(edge a, edge b)

//然後使用sort()函式sort(data.begin(), data.end(), cmp);

舉例如下:

#include

#include

#include

using

namespace

std;struct

edge};bool

cmp(edge a, edge b)

intmain

()  return

0;}

3、定義 operator()():

operator()過載函式需要被定義(宣告)在乙個新的結構體內。如下:

#include

#include

#include

using

namespace

std;struct

cmp};int

main

()  return

0;}

三種方法,我都快記不太清楚了,這裡總結如下:

1、operator<() 僅適用於自定義結構體(operator()()過載後形參必須要有結構體)。operator<() 函式的新增可以從容修改自帶排序功能的容器(set, priority_queue等)的比較規則,在定義該容器時只需set或priority_queue即可,不需要新增其他引數。在使用sort()函式時也不用指定比較函式。

2、定義比較函式,目前本人只知道其用於stl裡sort()的第三個引數。

3、operator()() 則適用於內建型別與自定義結構體(operator()()形參可以是內建資料型別)以及sort(),但需要類似這樣定義容器set或priority_queue, cmp>,其中cmp為僅包含operator()()函式的結構體。

後來發現這樣並不是很便於記憶,可以按照容器型別記憶見: stl中sort、priority_queue、map、set的自定義比較函式

sort():operator<()、比較函式、operator()()

map, set, priority_queue:operator<()、operator()()

除此之外,我們在使用sort()或定義容器時,還可以使用greater和less,當t為內建型別時,注意在sort使用中需要在後額外加()。

參考自:3 ways to define comparison functions in c++

stl裡有不少東西需要比較函式,例如 sort(),set,priority_queue。

下面我們提供三種比較函式。

1、定義 operator<():

使用該方法的前提是有預設的比較函式會呼叫我們的 operator<()。

比如我們有如下類,那麼我們可以這樣定義 operator<。

struct

edge;bool

operator

<(edge a, edge b)

這樣,我們就有了下面的例子。

#include

#include

#include

#include

#include

using

namespace

std;struct

edge};bool

operator

<(edge a, edge b)int

main

() vector

vec; vec.push_back(edge(0, 1, 7)); vec.push_back(edge(1, 2, 4)); vec.push_back(edge(2, 3, 10)); vec.push_back(edge(3, 4, 5)); sort(vec.begin(), vec.end()); //sort()函式預設為增序,這裡反轉為降序。

for(int i = 0; i < vec.size(); ++i)  set

se; set

::iterator iter; se.insert(edge(0, 1, 7)); se.insert(edge(1, 2, 4)); se.insert(edge(2, 3, 10)); se.insert(edge(3, 4, 5));      //set預設為增序,這裡反轉為降序。

for(iter = se.begin(); iter != se.end(); ++iter)   return

0;}

對應的輸出為:

457

101075

41075

4

2、定義乙個普通的比較函式:

還是用前面的設定:

struct

edge;bool

cmp(edge a, edge b)

//然後使用sort()函式sort(data.begin(), data.end(), cmp);

舉例如下:

#include

#include

#include

using

namespace

std;struct

edge};bool

cmp(edge a, edge b)

intmain

()  return

0;}

3、定義 operator()():

operator()過載函式需要被定義(宣告)在乙個新的結構體內。如下:

#include

#include

#include

using

namespace

std;struct

cmp};int

main

()  return

0;}

三種方法,我都快記不太清楚了,這裡總結如下:

1、operator<() 僅適用於自定義結構體(operator()()過載後形參必須要有結構體)。operator<() 函式的新增可以從容修改自帶排序功能的容器(set, priority_queue等)的比較規則,在定義該容器時只需set或priority_queue即可,不需要新增其他引數。在使用sort()函式時也不用指定比較函式。

2、定義比較函式,目前本人只知道其用於stl裡sort()的第三個引數。

3、operator()() 則適用於內建型別與自定義結構體(operator()()形參可以是內建資料型別)以及sort(),但需要類似這樣定義容器set或priority_queue, cmp>,其中cmp為僅包含operator()()函式的結構體。

後來發現這樣並不是很便於記憶,可以按照容器型別記憶見: stl中sort、priority_queue、map、set的自定義比較函式

sort():operator<()、比較函式、operator()()

map, set, priority_queue:operator<()、operator()()

除此之外,我們在使用sort()或定義容器時,還可以使用greater和less,當t為內建型別時,注意在sort使用中需要在後額外加()。

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

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

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

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

定義函式的三種形式

定義函式時引數是函式體接收外部傳值的一種媒介,其實就是乙個變數名 在函式階段括號內沒有引數,稱為無參函式。需要注意的是 定義時無參,意味著呼叫時也無需傳入引數。如果函式體 邏輯不需要依賴外部傳入的值,必須得定義成無參函式。def func print hello nick func hello ni...