2013-12-21 44 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()); 
}