6

EASTL を調べていると、奇妙なコード行に出くわしました。次のリンクは、対象の行番号が 1870 のファイルを示しています。

https://github.com/paulhodge/EASTL/blob/master/include/EASTL/algorithm.h

その行のコードはif(!(value < *i)). コメントには、「値の比較は常に < または == で表現されますが、その理由についての説明はありません。同じコメントが配置されている他のいくつかの領域もありますが、説明はありません。

そのような比較を書くことに何か利点はありますか (おそらく、私が見落としているいくつかのコンテキスト)? そうでない場合、EASTL の作成者はなぜ意図的にこの特定の方法でそれを書き、それについてコメントすることさえしたのでしょうか? ここでの唯一の理由は一貫性ですか?

4

4 に答える 4

11

<これは、==コンテナの値の型に対してのみ提供する必要があることを意味します。また、これらの型の変動の量を減らすことも意味します (すべてのアルゴリズムが と を意味するために使用する!(a<b)ため) 。そうしないと、一貫性のない結果が返される可能性があります。a>=b!(a==b)a!=b>=!=

于 2012-01-05T03:18:44.383 に答える
8

C++ では、<演算子をオーバーロードして、 の反対とは異なる動作を>=させることができるため、同等であることが保証されません。

さらに、どの IEEE 浮動小数点実装でも、 はNaN < NaNfalseです NaN >= NaN!(NaN < NaN)もそうNaN >= NaNです。

于 2012-01-05T03:22:36.877 に答える
1

少なくとも1つの違いがあります。数値の1つがQNAN(浮動小数点0/0)の場合、!(a <b)はaまたはbのいずれかがQNANの場合は常にTRUEを返しますが、a>=bの場合は常にfalseを返します。

于 2012-01-05T03:24:01.583 に答える
1

小なり演算子だけを使用して、他のすべての比較演算子をシミュレートできます。これにより、一貫性が向上し、比較をパラメーター化する必要がある場合に単一のテンプレート パラメーターを使用できるようになります。たとえば、標準のソートされたコンテナーとアルゴリズムはstd::less<T>、デフォルトのテンプレート コンパレーターとして使用します。

operation  equivalent
x < y      x < y
x > y      y < x
x <= y     !(y < x)
x >= y     !(x < y)
x == y     !(x < y) && !(y < x)
x != y     (x < y) || (y < x)

==順序が重要でない操作では、代わりに演算子を使用する方が簡単で効率的です。

于 2012-01-05T03:32:18.283 に答える