Простой ответ заключается в том, что вы не можете, по крайней мере, не так легко.Вы должны определить оператор сравнения, который определяет строгий слабый порядок.Если у вас есть что-то вроде:
bool
cmpDouble( double lhs, double rhs )
{
return abs( lhs - rhs ) < eps
? false
: lhs < rhs;
}
, тогда ! (a < b) && ! (b < a)
не определяет отношения эквивалентности, поэтому основное требование не выполняется.
Можно использовать что-то вроде:
bool
cmpDouble( double lhs, double rhs )
{
double iLhs;
modf( 1e8 * lhs, &iLhs );
double iRhs;
modf( 1e8 * rhs, &iRhs );
return iLhs < iRhs;
}
Но, честно говоря, я подозреваю, что если источник ваших двойников требует такого рода вещи, они, вероятно, не подходят для хранения в set
.