1. 程式人生 > >c++中sort函式排序自己寫的類

c++中sort函式排序自己寫的類

定義排序函式:

方法1:宣告外部比較函式

bool Less(const Student& s1, const Student& s2)
{
    return s1.name < s2.name; //從小到大排序
}
std::sort(sutVector.begin(), stuVector.end(), Less);

注意:比較函式必須寫在類外部(全域性區域)或宣告為靜態函式

當comp作為類的成員函式時,預設擁有一個this指標,這樣和sort函式所需要使用的排序函式型別不一樣。

否則,會出現錯誤

方法2:過載類的比較運算子

bool operator<(const Student& s1, const
Student& s2) { return s1.name < s2.name; //從小到大排序 } std::sort(sutVector.begin(), stuVector.end());

方法3:宣告比較類

struct Less
{
    bool operator()(const Student& s1, const Student& s2)
    {
        return s1.name < s2.name; //從小到大排序
    }
};

std::sort(sutVector.begin(), stuVector.end(), Less());




(一)為什麼要用c++標準庫裡的排序函式Sort()函式是c++一種排序方法之一,學會了這種方法也打消我學習c++以來使用的氣泡排序和選擇排序所帶來的執行效率不高的問題!因為它使用的排序方法是類似於快排的方法,時間複雜度為n*log2(n),執行效率較高!(二)c++標準庫裡的排序函式的使用方法I)Sort函式包含在標頭檔案為#include<algorithm>的c++標準庫中,呼叫標準庫裡的排序方法可以不必知道其內部是如何實現的,只要出現我們想要的結果即可!II)Sort函式有三個引數:(1)第一個是要排序的陣列的起始地址。(2)第二個是結束的地址(最後一位要排序的地址)(3)第三個引數是排序的方法,可以是從大到小也可是從小到大,還可以不寫第三個引數,此時預設的排序方法是從小到大排序。Sort函式使用模板:Sort(start,end,,排序方法)下面就具體使用sort()函式結合對數組裡的十個數進行排序做一個說明!例一:sort函式沒有第三個引數,實現的是從小到大#include<iostream>
#include<algorithm>using namespace std;int main(){ int a[10]={9,6,3,8,5,2,7,4,1,0}; for(int i=0;i<10;i++) cout<<a[i]<<endl;sort(a,a+10); for(int i=0;i<10;i++) cout<<a[i]<<endl; return 0;}例二通過上面的例子,會產生疑問:要實現從大到小的排序腫麼辦? 這就如前文所說需要在sort()函式裡的第三個引數裡做文章了,告訴程式我要從大到小排序!需要加入一個比較函式 complare(),此函式的實現過程是這樣的bool complare(int a,int b){ return a>b;}這就是告訴程式要實現從大到小的排序的方法!#include<iostream>#include<algorithm>using namespace std;bool complare(int a,int b){ return a>b;}int main(){ int a[10]={9,6,3,8,5,2,7,4,1,0}; for(int i=0;i<10;i++) cout<<a[i]<<endl; sort(a,a+10,complare);//在這裡就不需要對complare函式傳入引數了,//這是規則 for(int i=0;i<10;i++) cout<<a[i]<<endl; return 0;}例三:通過上面例一、二的方法雖然實現了從大到小和從大到小的排序,這樣做還是有點麻煩,因為還需要自己編寫告訴程式進行何種排序的函式,c++標準庫強大的功能完全可以解決這種麻煩。Sortt函式的第三個引數可以用這樣的語句告訴程式你所採用的排序原則less<資料型別>()//從小到大排序greater<資料型別>()//從大到小排序結合本例子,這樣的就可以完成你想要的任何一種排序原則了#include<iostream>#include<algorithm>using namespace std;int main(){ int a[10]={9,6,3,8,5,2,7,4,1,0}; for(int i=0;i<10;i++) cout<<a[i]<<endl;sort(a,a+10,less<int>()); for(int i=0;i<10;i++) cout<<a[i]<<endl; return 0;}#include<iostream>#include<algorithm>using namespace std;int main(){ int a[10]={9,6,3,8,5,2,7,4,1,0}; for(int i=0;i<10;i++) cout<<a[i]<<endl; sort(a,a+10,greater<int>()); for(int i=0;i<10;i++) cout<<a[i]<<endl; return 0;}例四:利用sort函式還可以實現對字元的排序,排序方法大同小異,下面就把程式範例展示一下#include<iostream>#include<algorithm>using namespace std;int main(){ char a[11]="asdfghjklk"; for(int i=0;i<10;i++) cout<<a[i]<<endl; sort(a,a+10,greater<char>()); for(int i=0;i<10;i++) cout<<a[i]<<endl; return 0;}

佛擋殺佛