C++ 我如何定义“一个”呢;“什么也不做”;分类

C++ 我如何定义“一个”呢;“什么也不做”;分类,c++,vector,sorting,predicate,user-defined,C++,Vector,Sorting,Predicate,User Defined,我正在开发一个系统,在这个系统中,我需要能够根据给定的谓词对向量进行排序,而我的类不应该控制这个谓词。基本上,我给他们传递一个派生类,他们盲目地对它排序 作为“令人愉快的怪癖”之一,其中一种排序模式是进入顺序。 这是我到目前为止得到的 struct Strategy { virtual bool operator()(const Loan& lhs, const Loan& rhs) const = 0; }; struct strategyA : public Stra

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

作为“令人愉快的怪癖”之一,其中一种排序模式是进入顺序。 这是我到目前为止得到的

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();
   }
};
显然,由于strategyA是自反性的,所以不能使用它,如果我将其设置为false,它将平等对待一切,我可以与我的数据吻别

这是我的问题。有没有一种方法可以定义一个谓词函数来排序一个不会改变任何东西的向量


我知道,可能最简单的解决方案是向Loan类添加一个order of entry变量,或者将其与一对中的一个组合。或者,我可以在谓词中输入一个参数,告诉排序器是否使用它。

如果它只是一个向量,那么您可以提供一个接口来确定是否应该排序。向量不是有序容器,因此需要显式地对它们进行排序。只是一点也不要把它们分类

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

这取决于算法。如果您的排序是a,那么“equal”元素的顺序将不会更改(对于不稳定的排序,这是未定义的)


考虑使用
std::stable_sort

没有排序功能,它只能根据项目的值来保持项目的顺序。如果可能,您需要为
策略提供更多信息。

另一种方法可能是将数据的语义引入容器。考虑使用Boo::Mulk索引用于访问和排序同一数据的不同方式:


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

Darios stable_排序答案非常好,如果您可以使用它的话

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

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


另一个问题-取决于容器-项目地址的顺序并不总是项目的顺序。

策略不应依赖于排序实现细节。在
策略中不能指望它会与稳定的排序算法一起使用