2013-12-21 41 views
2

我有類Racecar和40 Racecar對象在vector中,每個對象都有一個名爲myTotalPoints的數據成員。排序類對象數據成員最大到最小

在每次比賽和積分獲得後,我想將所有對象的數據成員從最大到最小排序,以便我可以在積分榜上顯示他們。有誰知道我可以如何排序所有40個對象的數據成員?

回答

4

您可以使用std::sort來解決此問題。

實現一個二進制函數是在sort功能, 並且在二元函數返回基礎上以兩種Racecar對象myTotalPoints的值之間的比較的值的第二個參數。

作爲指令去,comp是:

接受的範圍作爲參數, 兩個元件,並返回轉換爲bool值

二元函數。返回的值表示 作爲第一個參數傳遞的元素是否會在第二個元素之前的 之前被指定爲它所定義的特定嚴格弱排序。函數不得修改其任何參數。這可以是一個 函數指針或函數對象。

+1

你能說明這樣的二進制函數可能是什麼樣子嗎? –

3

最簡單和最簡潔的方法是使用std::sort()C++11 lambda

std::sort(std::begin(racecars), std::end(racecars), 
    [](Racecar const& a, Racecar const& b) { 
    return b.myTotalPoints < a.myTotalPoints; 
    }); 

See an example run

+1

@ r.v他已經在比較右側和左側,所以沒關係。 – greatwolf

1

如果您想按相反順序對您的矢量進行排序,請使用反向迭代器。

std::sort(racecars.rbegin(), racecars.rend()); 

這將工作,如果你有超載operator<

struct Racecar { 
    int totalPoints; 
    friend bool operator<(const Racecar& left, const Racecar& right); 
}; 

bool operator<(const Racecar& left, const Racecar& right) { 
    return left.totalPoints < right.totalPoints; 
} 

int main() 
{ 
    std::vector<Racecar> cars; 
    for (int i = 0; i < 20; i++) 
     cars.push_back(Racecar{i}); 
    std::random_shuffle(cars.begin(), cars.end()); 
    std::sort(cars.rbegin(), cars.rend()); 
}