如何定义"Do-Nothing"排序?

dew*_*rde 5 c++ sorting predicate vector user-defined

我正在开发一个系统,我需要能够通过给定的谓词对向量进行排序,我的类不应该控制它.基本上,我传给他们一个派生类,他们盲目地对它进行排序.

作为"令人愉快的怪癖"之一,排序模式之一是进入顺序.这是我到目前为止所得到的.

struct Strategy
{
   virtual bool operator()(const Loan& lhs, const Loan& rhs) const = 0;
};

struct strategyA : public Strategy
{
   bool operator()(const Loan& lhs, const Loan& rhs) const
   {
      return true;
   }
};

struct strategyB : public Strategy
{
   bool operator()(const Loan& lhs, const Loan& rhs) const
   {
      return lhs.getID() > rhs.getID();
   }
};

struct strategyC : public Strategy
{
   bool operator()(const Loan& lhs, const Loan& rhs) const
   {
      return lhs.getFee() > rhs.getFee();
   }
};
Run Code Online (Sandbox Code Playgroud)

显然,由于策略A是反身的,它不能被使用,如果我把它设置为假,它会把一切都视为平等,我可以亲吻我的数据再见.

所以这是我的问题.有没有办法定义一个谓词函数来排序一个不会改变任何东西的向量?

我知道可能最简单的解决方案是将一个入口变量的顺序添加到Loan类中,或者将它与一对中的一个匹配.或者,我可以使用谓词来输入参数,该谓词告诉分拣机是否使用它.

Dar*_*rio 7

有没有办法定义一个谓词函数来排序一个不会改变任何东西的向量?

这取决于算法.如果您的排序是稳定的排序,则"等于"元素的顺序将不会更改(对于不稳定的排序,这是未定义的).

考虑使用std::stable_sort.


小智 2

就我个人而言,我认为你的策略类应该有一个“排序”方法。这样,它就可以根据需要调用 std::sort 或不调用 std::sort 。是否以及如何成为排序策略的一部分。

Darios stable_sort 的答案非常好,如果你可以使用它的话。

可以根据向量中的项目位置进行排序,但这并不意味着项目不会移动(许多排序算法基本上会先打乱然后重新排序您的数据),因此您必须有一些可靠的方法来确定您开始时项目所在的位置。

比较可以保留当前位置到原始位置的映射,但需要做很多工作。理想情况下,逻辑需要内置到排序算法中 - 而不仅仅是比较 - 这本质上就是 stable_sort 的工作原理。

另一个问题 - 根据容器 - (例如)项目地址的顺序并不总是项目的顺序。