C + +与南排序。为什么排序无法正确退出

时间:2018-08-23 18:36:09

标签: sorting nan

我想在c ++中使用“ sort”对双精度向量(具有多个NaN值)进行排序。我希望NaN在向量的后面重新排序(我可以使用“ remove”函数对值进行预处理,但是我很好奇为什么当前的代码不起作用)。该程序不会针对一组特定的输入退出。有问题的程序如下:

vector<double> A{0.257367, 0.256835, 0.257094, 0.257067, 0.256707, 0.256724, 0.257166, 0.0/0.0, 0.256541, 0.257119, 0.257065, 0.256937, 0.257075, 0.257067, 0.256778, 0.256989, 0.256664, 0.256466, 0.25707, 0.256889, 0.257136, 0.0/0.0, 0.256843, 0.256323, 0.256931, 0.256404, 0.256392, 0.256405, 0.256047, 0.25633, 0.255451, 0.0/0.0, 0.256026, 0.255875, 0.255754, 0.25613, 0.256278, 0.256115, 0.0/0.0, 0.256074, 0.256172, 0.256126, 0.256565, 0.256807, 0.256279, 0.256289, 0.256787, 0.256945, 0.256397, 0.0/0.0, 0.256816, 0.256775, 0.256734, 0.0/0.0, 0.256915, 0.256919, 0.257003, 0.256906, 0.256338, 0.255988, 0.249046, 0.249932, 0.249964, 0.249632, 0.250288, 0.250855, 0.251464, 0.251631, 0.252197, 0.25324, 0.253315, 0.253456, 0.254093, 0.25427, 0.254699, 0.254919, 0.255061, 0.255149, 0.25572, 0.255897, 0.25569, 0.256172, 0.256007, 0.256331, 0.256378, 0.256324, 0.256773, 0.256473, 0.25679, 0.256372, 0.238573, 0.239315, 0.239328, 0.240574, 0.241281, 0.242129, 0.243075, 0.24391, 0.243958, 0.245451, 0.245936, 0.247785, 0.248352, 0.24831, 0.249264, 0.25075, 0.2513, 0.251976, 0.252656, 0.253461, 0.254081, 0.254723, 0.254764, 0.255449, 0.0/0.0, 0.255802, 0.2563, 0.256352, 0.256758, 0.256187, 0.224057, 0.225205, 0.225888, 0.227081, 0.228535, 0.229993, 0.230934, 0.232928, 0.233696, 0.235631, 0.237125, 0.238275, 0.239589, 0.241336, 0.24238, 0.244349, 0.244904, 0.246259, 0.248209, 0.248963, 0.250566, 0.252173, 0.252602, 0.253539, 0.254274, 0.255162, 0.255254, 0.255673, 0.256347, 0.25615, 0.20776, 0.209018, 0.209901, 0.211938, 0.213811, 0.215881, 0.217347, 0.219078, 0.220714, 0.223599, 0.224932, 0.22725, 0.229422, 0.231103, 0.233058, 0.236197, 0.237434, 0.239692, 0.241409, 0.243654, 0.24602};

// If do this, the program will exit correctly:
// A.pop_back();

// sort.
auto cmp=[](const double &d1, const double &d2){
    if (isnan(d2)) return true;
    return d1<d2;
}; 
sort(A.begin(),A.end(),cmp);

// print.
for (auto &item:A) cout << item << " ";
cout << endl;

1 个答案:

答案 0 :(得分:0)

我不确定A.pop_back()为何起作用,但是如果您进行更改

auto cmp=[](const double &d1, const double &d2){
    if (isnan(d2)) return true;
    return d1<d2;
}; 

d1添加支票

auto cmp=[](const double &d1, const double &d2){
    if (isnan(d1)) return false;
    if (isnan(d2)) return true;
    return d1<d2;
}; 

它将按预期工作。

我假设因为您没有检查d1是否为nan,所以无法将两者与d1<d2进行比较