按字典顺序对c ++中的多维向量进行排序

Posted

技术标签:

【中文标题】按字典顺序对c ++中的多维向量进行排序【英文标题】:Sort multi-dimensional vector in c++ lexicographically 【发布时间】:2014-05-19 21:53:15 【问题描述】:

假设我有这个 5X3 的二维向量 arr:

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 浮点向量的实际项目中,它不会对第二列进行排序!这个向量的大尺寸会是一个问题吗?在这种情况下,解决方案是什么?我是否应该对第一列进行排序,然后根据具有相同第一个元素的行划分数组,对较小数组的第二列进行排序,然后合并它们?有没有更好的解决方案?

感谢任何建议。

【问题讨论】:

【参考方案1】:

您不需要自己的比较器。默认设置可以开箱即用,因为 std::vector 已经有一个 operator&lt; 用于执行字典比较。

std::stable_sort(arr.begin(), arr.end());

【讨论】:

问题不在于代码,而在于浮点数的精度。是的,你是对的,默认比较也有效。【参考方案2】:

我发现了问题;我有这些行:

-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 

所以,我期待第三行出现在第一行和第二行之前。

【讨论】:

以上是关于按字典顺序对c ++中的多维向量进行排序的主要内容,如果未能解决你的问题,请参考以下文章

C ++:从文本文件中读取单行,按字母顺序对单词进行排序

按字母顺序对字符串列表进行排序 (C)

按频率和进入顺序重新排序向量

有没有一种简单的方法可以按字母顺序对字符串中的字符进行排序

通过按字母顺序仅对一行中的一些字段进行排序来重塑 R 中的数据框

按字母顺序对表格中的列名进行排序