はい、operator<
セットまたはマップで標準を使用します。ほとんどのあいまい比較演算子は、またはdouble
で使用できるほど厳密ではありません。(そして、上記のマップにアクセスしているときに浮動小数点モードをいじっていないことを願っています...)map
set
multimap
またはを使用することをお勧めしmultiset
ます。これは、等しいと思われる 2 つの値がわずかに異なる可能性があるためです。すでに複数のエントリが予想される場合は、ほぼ等しいエントリをより適切に処理する必要があります。
次に、ヒットを検索するときに、思った場所にないマップ内のエントリをキャッチするために実行しますlower_bound(x - epsilon)
。upper_bound(x + epsilon)
つまり、ここに「is this double
in this multiset<double>
」コードがあります:
typedef std::multiset<double> double_set;
std::pair< double_set::iterator, double_set::iterator >
get_equal_range( double_set& s, double d, double epsilon = 0.00001 )
{
auto lower = s.lower_bound( d-epsilon );
auto upper = s.upper_bound( d+epsilon );
return std::make_pair( lower, upper );
}
std::pair< double_set::const_iterator, double_set::const_iterator >
get_equal_range( double_set const& s, double d, double epsilon = 0.00001 )
{
auto lower = s.lower_bound( d-epsilon );
auto upper = s.upper_bound( d+epsilon );
return std::make_pair( lower, upper );
}
bool TestMembership( double_set const& s, double d, double epsilon = 0.00001 )
{
auto range = get_equal_range( s, d, epsilon );
return range.first != range.second;
}
そのため、特定double
の がエントリの範囲にマップされたり、set
.
以下の素晴らしい回答から盗まれました:デフォルトのダブルは、パスするoperator<
とあなたのmap
またはを台無しにします.set
NaN
map
and set
(および複数のバージョン) に配置する場合は、厳密な弱い順序付け規則を維持する必要があります。失敗すると、一見ランダムなクラッシュが発生し、時折無限ループが発生します。 と のコードはmap
、set
順序付けの失敗に対して堅牢ではありません。