假设我有这个2维向量arr,它是5X3:
3, 4, 1
1, 7, 2
5, 2, 8
1, 3, 1
5, 0, 0
我希望按字典顺序对其进行排序,如下:
1, 3, 1
1, 7, 2
3, 4, 1
5, 0, 0
5, 2, 8
换句话说,我希望主要根据第一个元素对行进行排序,然后如果两行具有相同的第一个元素,则根据第二个元素对行进行排序,我不希望相对于第二个元素排序第三要素。
这是我写的代码:
bool compare (vector<float> ar1, vector<float> ar2) {
if (ar1[0]<ar2[0]) return 1;
if (ar1[0]>ar2[0]) return 0;
if (ar1[1]<ar2[1]) return 1;
if (ar1[1]>ar2[1]) return 0;
return 0;
}
stable_sort(arr.begin(), arr.end(), compare);
代码似乎为上述矢量提供了所需的结果。但是,在我有一个4506X3浮动向量的实际项目中,它不会对第二列进行排序!这个向量的大尺寸可以成为一个问题吗?在那种情况下,解决方案是什么?我应该对第一列进行排序,然后根据具有相同第一个元素的行划分数组,对较小数组的第二列进行排序然后合并它们?有更好的解决方案吗?
我感谢任何建议。
答案 0 :(得分:4)
您不需要自己的比较器。默认设置是开箱即用的,因为operator<
已经std::vector
执行字典比较。
std::stable_sort(arr.begin(), arr.end());
答案 1 :(得分:1)
我发现了问题;我有这些行:
-19.235676 44.020599 0.151365
-19.235676 43.333611 0.201697
-19.235674 40.585663 0.151365
当我从文件中读取它们并将它们推回到我的向量时,它们变成了:
-19.2357 44.0206 0.151365
-19.2357 43.3336 0.201697
-19.2357 40.5857 0.151365
所以,我期待第三行出现在第一行和第二行之前。