參考自: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...