这是更大代码的一部分,但以下内容应该给出足够精确的概念。请考虑以下代码,根据第二个条目对许多<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()
中的绘制是根据其第一个条目(通过构造不包含绘制)进行排序的?
答案 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
}