多次排序矢量

时间:2013-03-03 08:41:26

标签: c++ sorting vector

我必须编写一个接受多行输入的程序,然后根据给定的几个命令行参数对它们进行排序。该行可以是可变长度的,行上的每个项都用逗号分隔,如下所示:

a,b,c,12,3
d,e,f,4,56
a,g,h,8,5

程序要做的是根据给定的参数对某些列的输入进行排序。这很简单,但困难的是我还必须能够对多个参数进行排序。

例如,命令行参数1,4(都是升序)将输出:

a,g,h,8,5
a,b,c,12,3
d,e,f,4,56

所以它根据第一列,然后第四列进行排序。我不确定如何排序,然后只使用下一个参数对冲突元素进行排序而不使用整个列。我目前正在将输入存储在矢量矢量中。

作为旁注,我已经阅读了一些类似的问题,但是所有这些问题都只有一定数量的东西需要排序。对于这个程序,每行的项目数可以是1以上,并且排序的参数数量也可以变化。

1 个答案:

答案 0 :(得分:1)

首先,使用std :: sort(),它首先使用迭代器,最后作为输入。 然后,使用递归。递归是解决方案的关键。

对于每个参数,即排序标准C_i,您有一个递归级别R_i。在每个递归级别R_i中,您有两个步骤:

  1. 根据标准C_i对给定的数据范围进行排序。
  2. 遍历数据范围。每当值C_i改变时,使用参数调用下一个递归级别R_ {i + 1}:
    • first:最后一次更改的迭代器,或者范围的开头
    • last:当前元素的迭代器(具有更改的C_i的第一个元素)
    • 参考/指向标准列表的指针和i + 1
  3. 就是这样!

    讨论这个解决方案:

    • 由于迭代器,这种方法很有效,因为底层数据结构不需要重新初始化,复制等等。
    • 你需要编写一个用i初始化的自定义比较器函子,并且总是根据向量的元素i进行比较。
    • 有什么更快的事情是值得商榷的:做一个大的排序,必须在每次比较中经历所有排序标准,或排序多次,如我的方法,并且每个只检查一个标准。
    • 在此解决方案中,交换了许多向量。然而,这不是问题,因为std :: vector swaps很便宜。