如何定义“无所事事”排序?

Posted

技术标签:

【中文标题】如何定义“无所事事”排序?【英文标题】:How can I define a "Do-Nothing" sort? 【发布时间】:2010-02-23 16:39:46 【问题描述】:

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

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

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 类添加一个输入顺序变量,或者将其与一对中的一个配对。或者,我可以在谓词中输入一个参数,告诉排序器是否使用它。

【问题讨论】:

【参考方案1】:

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

这取决于算法。如果您的排序是stable sort,则“相等”元素的顺序不会改变(对于不稳定的排序未定义)。

考虑使用std::stable_sort

【讨论】:

Strategy 不应依赖于排序实现细节。不能依赖Strategy 将其与稳定的排序算法一起使用。 好吧,我的评论是针对topicstarter的。 ;)【参考方案2】:

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

Darios stable_sort 答案非常好,如果你能用的话。

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

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

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

【讨论】:

【参考方案3】:

如果它只是您正在谈论的向量,也许您可​​以提供一个接口来确定您是否应该排序。向量不是有序容器,因此您需要明确对它们进行排序。根本不要对它们进行排序。

【讨论】:

【参考方案4】:

没有排序功能可以仅根据项目的值来保持项目的顺序。如果可能,您需要向您的Strategy 提供更多信息。

【讨论】:

【参考方案5】:

另一种方法可能是将数据的语义引入容器。考虑使用 boost::multi_index 对同一数据进行不同的访问和排序方式:

http://www.boost.org/doc/libs/1_42_0/libs/multi_index/doc/index.html

【讨论】:

以上是关于如何定义“无所事事”排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Comparator 定义自定义排序顺序?

如何使用快速编码根据特定的排序顺序对自定义对象进行排序

excel2013如何通过自定义排序方式来进行排序

如何使用 jquery 创建自定义排序条件

如何自定义排序 VCL TListBox?

如何自定义这个已经自定义的 jQuery 排序解决方案?