根据配对向量的第二个条目,将比较函数更改为排序

时间:2014-09-25 11:27:44

标签: c++ c++11

这是更大代码的一部分,但以下内容应该给出足够精确的概念。请考虑以下代码,根据第二个条目对许多<int,double>对进行排序:

using namespace std;
using namespace Eigen;
using Eigen::VectorXd;
using Eigen::VectorXi;

class SortData {
public:
    int index;
    double value;
    SortData();
    SortData(int,double);
};
inline SortData::SortData(int first,double second) {
    index=first;
    value=second;
}
bool sortDataIsLess(const SortData& left,const SortData& right){
    return left.value<right.value;
}

[...]

const int n=x.size();
vector<SortData> VectortoSort(n);
for(int i=0;i<n;i++)     VectortoSort[i]=SortData(i,x(i));
std::sort(VectortoSort.begin(),VectortoSort.begin()+n,sortDataIsLess);

[...]

我的问题是:如何更改排序运算符sortDataIsLess() VectortoSort()中的绘制是根据其第一个条目(通过构造不包含绘制)进行排序的?

1 个答案:

答案 0 :(得分:1)

bool sortDataIsLess(const SortData& left,const SortData& right){
    if(left.value == right.value)
        return left.index < right.index;
    return left.value<right.value;
}

应该做的伎俩。

编辑:请注意,SortData.value是一个双精度数。将浮点数与==进行比较可能会导致错误的结果。您可能想要使用特定的评估功能:

bool sortDataIsLess(const SortData& left,const SortData& right){
    if(equalsD(left.value, right.value))
        return left.index < right.index;
    return left.value<right.value;
}

bool equalsD(double l, double r) {
    return (abs(l-r) < EPSILON)); // EPSILON is the tolerance to be used
}