我工作的一个系统,在那里,我需要可以排序的一个矢量由特定语,这是我的课程不应该有控制权。基本上,我通过他们的一个源类和他们盲目地进行排序。

为一体的"令人愉快的怪癖",一种模式是为了入境。这是什么我有这么远。

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是自反,它不能使用,和如果我落到错误的,它会把一切都作为平等和我可以吻我的数据再见。

因此,这里是我的问题。是否有办法的定义谓的功能于排序的一个向量不会改变什么?

我知道,可能是最简单的解决办法是添加一个单的输入变量的贷款类或合作伙伴与一个在一个对。或者我可以饲料中的一个参数与谓词,告诉这类器是否使用它。

有帮助吗?

解决方案

就个人而言,我认为您的策略类应该具有“排序”方法。这样,它可以调用STD ::排序,无论是否合适。 无论 以及如何成为分类策略的一部分。

如果您可以使用它,darios stable_sort答案非常好。

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

可以进行比较,将当前位置的映射保留到原始位置,但要进行大量工作。理想情况下,逻辑需要内置到排序算法中 - 不仅是比较 - 从本质上讲,这是stable_sort的工作原理。

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

其他提示

有没有一种方法来定义谓词函数来分类不会更改任何内容的向量?

这取决于算法。如果你的出现是 稳定排序, ,“相等”元素的顺序不会更改(对于不稳定的情况,这是不确定的)。

考虑使用 std::stable_sort.

如果这只是一个矢量你正在谈论,也许你可以逃脱提供一个界面,确定是否应进行排序或没有。矢量不是一个有序的容器,所以你需要明确它们进行排序。只是不要对它们进行排序。

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

一种不同的方法可能是将数据的语义带到容器中。考虑使用boost :: multi_index来访问和订购相同数据的不同方式:

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top