5

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

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

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

4

5 回答 5

7

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

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

考虑使用std::stable_sort.

于 2010-02-23T16:43:59.587 回答
2

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

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

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

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

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

于 2010-02-23T16:55:53.147 回答
1

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

于 2010-02-23T16:42:26.307 回答
1

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

于 2010-02-23T16:46:39.103 回答
0

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

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

于 2010-02-23T16:47:50.770 回答