矢量排序算法,仅对大于 0 的元素进行排序
Vector Sort Algorithm, sort only elements bigger then 0
我必须对结构向量进行排序。假设结构有两个成员:
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 的游戏进行排序。 提前谢谢。
您可以使用std::stable_sort
来防止在不受排序条件影响的元素周围移动。
std::stable_sort(games.begin(),games.end(), [](game& info1, game& info2)
{
return info1.rating > info2.rating;
});
std::sort()
不是一个稳定的排序算法,即具有等效键的元素在排序后可能无法保持它们之间的原始顺序。
您可以使用std::stable_sort()
代替std::sort()
:
std::stable_sort(games.begin(),games.end(), [](game& info1, game& info2)
{
return info1.rating > info2.rating;
});
顾名思义,std::stable_sort()
实现了稳定的排序算法。
您可以使用std::stable_sort()
.
但是,您可以继续使用std::sort()
并使比较器返回具有相同评级的游戏的true
(因此保留相对顺序),方法是将条件更改为
return !(info1.rating < info2.rating)
您可以使用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;
});
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<
因为这会导致混淆,因为游戏标题也可以用作逻辑排序方式)
- 查找两个排序向量中共有的元素
- C++ 如何比较n个排序的整数向量以找到互元素?
- 如何在 c++ 中根据第二个元素按降序对列表进行排序
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 高级选择排序 - 在一次迭代中搜索两个元素
- 为什么用户定义的函数不按照给定的顺序对相同长度的元素进行排序?
- 为什么这个选择排序算法仍然切换一个元素,当它已经是其他元素中最小的元素时?
- 快速排序 - 三个中位数枢轴选择 - 某些元素顺序不正确
- 将一系列已排序的元素划分为相邻组
- 如何通过保持第一个插入的位置来对列表中插入的其余元素进行排序?
- 保持排序的数据结构,允许log N插入时间,并且可以返回我在log N中查找的元素的索引
- "x"的所有元素都存在于"y"(排序向量)中吗?
- 如何根据对的第二个元素对 STL c++ 中的一组对进行排序?
- 如何在保持它们连接到同一元素的同时对 2 个数组进行排序?
- C++:结构与用于排序元素的函数
- 无法在阵列中重新排序元素-rapidjson
- 比较两个向量中的未排序元素
- 我如何在队列中排序元素
- c++中的Hashmap不排序元素
- c++插入排序元素