2012-03-14 105 views
3

可能重複:
How to use std::sort with a vector of structures and compare function?排序對象的屬性對象的矢量

我有一隻貓對象(什麼?),和這顯然排序貓對象catSort對象。以下是類

class cat { 
public: 
    int age; 
}; 

class catSorter { 
public: 
    vector<cat> cats; 
    vector<cat> SortCatsByAge(); 
    void AddCat(cat new_cat); 
}; 

void catSorter::AddCat(cat new_cat){ 
    this->cats.push_back(new_cat) 
} 

vector<cat> catSorter::SortCatsByAge(){ 
    // Sort cats here by age! 
} 


cat tim; 
tim.age = 10; 

cat mark; 
mark.age = 20 

cat phil; 
phil.age = 3; 

catSorter sorter; 
sorter->AddCat(tim); 
sorter->AddCat(mark); 
sorter->AddCat(phil); 

std::<vector> sortedcats = sorter->SortCatsByAge(); 

我在排序矢量時遇到困難,我該如何去做這件事?我是否應該循環訪問cats屬性並將它們存儲在臨時向量中,然後返回該屬性?有沒有更簡單的方法來做到這一點?

+0

[查找了std :: sort](http://msdn.microsoft.com/en-us/library/ecdecxh1(v = vs.80).aspx)你會想用一個謂詞來告訴它如何對'cat'對象。 – 2012-03-14 17:03:17

回答

11

你應該實現在貓的operator<讓貓可以排序:

class cat { 
public: 
    int age; 
    bool operator< (const cat &other) const { 
     return age < other.age; 
    } 
}; 

然後,您可以包括「算法」的頭和陣列上使用std::sort

vector<cat> catSorter::SortCatsByAge(){ 
    vector<cat> cats_copy = cats; 
    std::sort(cats_copy.begin(), cats_copy.end()); 
    return cats_copy; 
} 
+1

如果您無法訪問'cat'類,或者您想根據不同目的按不同屬性進行排序,該怎麼辦? – 2013-11-03 22:31:50

+0

@DrewNoakes您可以將'operator <'定義爲一個自由函數或提供一個自定義比較函數作爲'std :: sort'的第三個參數。 – mfontanini 2013-11-03 22:51:01

+0

爲什麼要'std :: sort(cats_copy.begin(),cats_copy.end());'按年齡排序?毛皮長度或貓的名字如何按字母順序排列? – Jonny 2016-04-04 06:14:47