我必须对结构向量进行排序。假设该结构具有两个成员:
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的这些游戏进行排序。 预先感谢。
答案 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<
,因为这会引起混淆,因为游戏标题也可以用作逻辑排序方式)