dew*_*rde 5 c++ sorting predicate vector user-defined
我正在开发一个系统,我需要能够通过给定的谓词对向量进行排序,我的类不应该控制它.基本上,我传给他们一个派生类,他们盲目地对它进行排序.
作为"令人愉快的怪癖"之一,排序模式之一是进入顺序.这是我到目前为止所得到的.
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();
}
};
Run Code Online (Sandbox Code Playgroud)
显然,由于策略A是反身的,它不能被使用,如果我把它设置为假,它会把一切都视为平等,我可以亲吻我的数据再见.
所以这是我的问题.有没有办法定义一个谓词函数来排序一个不会改变任何东西的向量?
我知道可能最简单的解决方案是将一个入口变量的顺序添加到Loan类中,或者将它与一对中的一个匹配.或者,我可以使用谓词来输入参数,该谓词告诉分拣机是否使用它.
小智 2
就我个人而言,我认为你的策略类应该有一个“排序”方法。这样,它就可以根据需要调用 std::sort 或不调用 std::sort 。是否以及如何成为排序策略的一部分。
Darios stable_sort 的答案非常好,如果你可以使用它的话。
可以根据向量中的项目位置进行排序,但这并不意味着项目不会移动(许多排序算法基本上会先打乱然后重新排序您的数据),因此您必须有一些可靠的方法来确定您开始时项目所在的位置。
比较可以保留当前位置到原始位置的映射,但需要做很多工作。理想情况下,逻辑需要内置到排序算法中 - 而不仅仅是比较 - 这本质上就是 stable_sort 的工作原理。
另一个问题 - 根据容器 - (例如)项目地址的顺序并不总是项目的顺序。