我正在开发一个系统,我需要能够通过给定的谓词对向量进行排序,我的类不应该控制它。基本上,我传给他们一个派生类,他们盲目地对它进行排序。
作为“令人愉快的怪癖”之一,排序模式之一是进入顺序。 这是我到目前为止所做的。
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();
}
};
显然,由于策略A是反身的,它不能被使用,如果我把它设置为假,它会把一切都视为平等,我可以亲吻我的数据再见。
所以这是我的问题。有没有一种方法可以定义一个谓词函数来排序一个不会改变任何东西的向量?
我知道可能最简单的解决方案是将一个入口变量的顺序添加到Loan类中,或者将其与一对中的一个匹配。或者,我可以使用谓词来输入参数,该谓词告诉分拣机是否使用它。
答案 0 :(得分:7)
有没有办法定义一个谓词函数来排序一个不会改变任何东西的向量?
这取决于算法。如果你的排序是stable sort,那么“相等”元素的顺序将不会改变(对于不稳定的排序,这是不确定的。)
考虑使用std::stable_sort
。
答案 1 :(得分:2)
就个人而言,我认为你的策略类应该有一个“排序”方法。这样,它可以调用std :: sort,因为它认为合适。 是否以及如何成为排序策略的一部分。
Darios stable_sort答案非常好,如果你可以使用它。
可以根据向量中的项目位置进行排序,但这并不意味着项目不会移动(许多排序算法基本上会对数据进行加扰 - 然后你的数据),所以你必须有一些可靠的开始时确定项目所在位置的方法。
比较可以保持当前位置到原始位置的映射,但需要做很多工作。理想情况下,逻辑需要构建在排序算法中 - 而不仅仅是比较 - 而且本质上就是stable_sort的工作原理。
另一个问题 - 取决于容器 - (例如)项目地址的顺序并不总是项目的顺序。
答案 2 :(得分:1)
如果它只是你所谈论的矢量,也许你可以通过提供一个界面来决定你是否应该排序。向量不是有序容器,因此您需要对它们进行显式排序。只是不要对它们进行排序。
答案 3 :(得分:1)
没有排序功能可以仅根据项目的值保持项目的顺序。如果可能,您需要向Strategy
提供更多信息。
答案 4 :(得分:0)
另一种方法可能是将数据的语义带到容器中。考虑将boost :: multi_index用于不同的访问方式和对相同数据的排序:
http://www.boost.org/doc/libs/1_42_0/libs/multi_index/doc/index.html