正如@ecatmur 首先在心理上检测到的那样,你的问题是你正在使用<
on double
s,以及您的一个或多个double
s is a NaN
.
A safe double
订购如下:
struct safe_double_order {
bool operator()(double lhs, double rhs) const {
if ((lhs != lhs) || (rhs != rhs)) // NaN detector
return (lhs!=lhs)>(rhs!=rhs); // order NaN less than everything, including -infinity
return lhs < rhs;
}
};
接下来,我们可以编写一个键排序器:
template<class K, class O=std::less<K>>
struct key_sorter {
struct helper {
K const& k;
helper( K const& o ):k(o) {}
template<typename V>
helper( std::pair<K, V> const& o ):k(o.first) {}
bool operator<( helper const& o ) const {
return O{}( k, k.o );
}
};
bool operator()( helper lhs, helper rhs ) const {
return lhs < rhs;
}
};
它传递了一个键类型和一个可选的排序函子,让您可以搜索/排序std::pair<Key,?>
with Key
直接输入。
std::vector< std::pair<double, X> > vec;
std::sort( vec.begin(), vec.end(), key_sorter<double, safe_double_order>{} );
auto match = std::equal_range( vec.begin(), vec.end(), value, key_sorter<double, safe_double_order>{} );
上面有一些 C++11ism,但是如果您使用 C++03,总体设计应该很清楚。