C 中關於set的自定義排序函式的書寫

2021-07-11 19:28:56 字數 1610 閱讀 7026

大概有兩個月沒用過c++啦,手都變得很生了,在這裡,在這裡我想扯一下關於set的比較函式的定義,我想,應該有不少人對這個東西感到頭疼吧!

如果說我想在set裡面新增乙個自定義的型別,比如說下面的結構體:

struct symbol

;

我們如果要用set來盛放symbol,我們應該怎麼辦麼?

set

gsym;

如果像上面這麼來寫的話,或許你的編譯能夠通過,但是應該插入兩個元素之後就會報錯:

symbol s1 = ;

symbol s2 = ;

gsym.insert(s1);

gsym.insert(s2);

你這麼乾是不行的,c++編譯器操蛋的地方在於,它默默地為你幹了一些事情,我這裡稍微來剖析一下這段**裡,編譯器到底為你幹了些什麼。

其實set的原型如下:

template ,

class alloc = alloc>

class set ;

模版裡面預設的比較函式是less,less函式的定義如下:

template

struct less : public binary_functionbool>

};

less函式其實是乙個仿函式,你在上面定義set gsym的時候,其實編譯器預設給你的比較函式是less,gsym要插入元素的時候,元素要和set裡面的元素進行比較,然而x < y,c++並不知道如何比較,x和y是symbol型別,所以就報錯了。

如何解決呢?給symbol型別定義乙個比較函式即可:

struct symbol

};

好了,修改**如上面即可。現在你執行**,應該沒問題了。

好吧,現在你想讓set中的元素從大到小排序,怎麼辦?

set

> gsym;

然後我們給symbol定義乙個>即可。

當然,你也可以不用greater, less等仿函式,你可以自己定義仿函式,怎麼定義呢?仿照上面的less函式即可,去掉泛型。

#include 

#include

#include

using

namespace

std;

struct symbol

;struct symcmp

};set

gset;

int main()

; symbol s2 = ;

gset.insert(s1);

gset.insert(s2);

gset.insert(s1);

gset.insert(s2);

gset.insert(s1);

system("pause");

return

0;}

好了,我想,我說清楚了,大家詳細了解的話,請檢視

set自定義排序

set一般插入元素時,預設使用關鍵字型別的 運算子來比較兩個關鍵字,故一般插入後為公升序,但是針對自定義資料結構,如結構體,沒有 運算子,故無法進行比較。針對自定義資料結構或者說自定義set排序規則有如下幾種方法 在自定義結構體中過載 則可以實現預設排序,示例 如下 include include ...

c 關於stl裡set容器的自定義排序

最近結合stl看資料結構,對許多原本半生不熟的知識都有了點領悟,大家知道stl裡無論是向量還是容器的sort演算法都很有用也很方便.但是似乎大家一直都是用int型別來初始化這些物件,那我用自定義的乙個結構來對初始化這些物件,並且想對結構裡的某乙個元素的大小來排序,該怎麼辦呢,我上網查了些資料,並根據...

C 自定義函式排序

第二個引數為結束位址 第三個引數為排序方式 第三個引數可以不寫,如果第三個引數不寫,那麼就是預設排序方式 從小到大 sort利用自定義比較函式 bool cmp int i1,int i2 sort arr,arr n,cmp 基本語法 typedef struct time time 對於sort...