向量排序算法,仅排序大于0的元素

时间:2018-12-17 12:07:41

标签: c++ algorithm sorting vector

我必须对结构向量进行排序。假设该结构具有两个成员:

Struct game
{
  string name;
  int rating;
};

所以我创建了 std::vector<game>个游戏,并简单地按等级对它们进行了排序。

std::sort(games.begin(),games.end(), [](game& info1, game& info2)
{
    return info1.rating > info2.rating;
});

到目前为止,一切都很好。 问题是,如果所有游戏的评级值均为0,它们就会混合在一起。简而言之,我必须仅对评级大于零的元素进行排序。让我们举个例子:

所有游戏均按字母顺序名称和等级0推入向量,触发排序后,字母顺序将被违反。

排序前的示例:

"A_Game""B_Game""C_Game""E_Game""G_Game"等(所有下一个字母继续)

排序后(所有游戏的评分均为0):

"G_Game""S_Game""P_Game""M_Game""L_Game""I_Game"

我只需要对评分大于0的这些游戏进行排序。 预先感谢。

5 个答案:

答案 0 :(得分:11)

您可以使用std::stable_sort来防止移动不受排序标准影响的元素。

std::stable_sort(games.begin(),games.end(), [](game& info1, game& info2)
{
    return info1.rating > info2.rating;
});

答案 1 :(得分:5)

std::sort()不是stable sorting algorithm,即具有相同键的元素在排序后可能不会保留它们之间的原始顺序。


您可以使用std::stable_sort()代替std::sort()

std::stable_sort(games.begin(),games.end(), [](game& info1, game& info2)
{
    return info1.rating > info2.rating;
});

顾名思义,std::stable_sort()实现了稳定的排序算法。

答案 2 :(得分:2)

您可以使用std::stable_sort()

但是,对于条件相同的游戏,您可以继续使用std::sort()并使比较器返回true(通过保持条件为准),方法是将条件更改为

return !(info1.rating < info2.rating)

答案 3 :(得分:1)

您可以使用stable_sort代替sort。这将是解决问题的最佳选择。

您还可以修改排序,以便在两个游戏的评级相同时,按字母顺序对两个名称进行比较(或将来可能出现的任何其他情况)。可能看起来像这样。

std::sort(games.begin(),games.end(), [](game& info1, game& info2)
{
    if (info1.rating == info2.rating)
        return info1.name.compare(info2.name);

    return info1.rating > info2.rating;
});

答案 4 :(得分:1)

std::sort实际上不保证元素比较相等时的任何排序。 std::stable_sort保证原始顺序在比较时保持不变。 (请参阅其他答案)

如果对原始顺序有疑问,我想明确地对所有条件进行排序:

std::sort(games.begin(),games.end(), [](game const & info1, game const & info2)
{
    if (info1.rating != info2.rating)
        return info1.rating > info2.rating;

    return info1.name < info2.name;
});

在上面,我更喜欢使用以下模式

if member1 different
    return compare member1
if member2 different
    return compare member2

return compare member<last> OR compare pointers

添加额外的成员时,这种模式很容易识别和扩展。

理想情况下,当您想在其他地方使用此排序时,请将其命名为明确的函数。 (不要使用operator<,因为这会引起混淆,因为游戏标题也可以用作逻辑排序方式)