大概有兩個月沒用過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...