2

過負荷==との違いは何<ですか?

たとえば、マップを使用する場合:

map<Type, int> a();

friend bool operator<(const Type& lhs, const Type& rhs);

friend bool operator==(const Type& lhs, const Type& rhs);

そして、呼び出すときに両方の演算子を実装します。

a.find(value);

の演算子関数==が呼び出されていますか? ないと思います。デバッグして、それ<が呼び出されているのを見ましたが、なぜですか? の演算子関数の動作はどうあるべき<ですか?

私はメソッドが呼び出されるJavaから来ておりequals、動作を理解するのは非常に簡単です。

ありがとう。

4

6 に答える 6

7

operator====演算子をオーバーロードします (他にはありません)。operator< 演算子をオーバーロードし<ます (他にはありません)。

std::mapはデフォルトでstd::less(および のみstd::less)std::lessを使用するように定義されており、デフォルトで使用するように定義され<ています。ただし、一般的には、順序付けられた比較がクラスにとって理にかなっていない限り、オーバーロードしないことをお勧めします。その場合、6 つの比較演算子すべてを首尾一貫した方法でオーバーロードする必要があります。operator<それ以外の場合は、比較機能型を追加のテンプレート引数として指定できますstd::map。比較機能オブジェクトは、厳密な弱い順序関係を定義する必要があります。型がキーとして使用されるように設計されていても、順序付けが純粋に恣意的である場合は、特殊化することができますstd::less

Javaに関しては、演算子のオーバーロードがなければ、明らかに使用できません<; デフォルトでは、SortedMap(Java で に相当するものstd::map) はキーが Comparable である必要がありますが、これには、 がであるか、それ以外であるかに応じて 、値、または0compare を返す関数が必要です。私はこれがもう少し論理的だと思うことを認めますが、違いは非常に小さいです. (C++ の決定の背後にある理論的根拠は、組み込みの型がキーとして使用できるか のようなものであるということです。Java では、それらをボックス化する必要があります。)<==>this<==>intdouble

于 2012-08-22T09:36:52.123 に答える
3

C++標準がstd::mapに課す要件は、それが自己平衡二分探索木として実装されることを意味します。これは、要素間のある種の順序比較が利用可能でなければならないことを意味します。の場合std::map、要件は厳密な弱順序であり、デフォルトはより少ない比較です。二分木に要素を配置するために必要なのはこれだけであり、ある要素(Aと呼ぶ)が別の要素(Bと呼ぶ)以上であり、その逆も真である場合、つまりBがA以上。同等性の比較を使用することもできますが、これにより、不整合の可能性が広がります。std::unordered_mapなどのハッシュテーブルを見ると、これは衝突を解決するためだけですが、等式の比較が実際に必要であることがわかります。

于 2012-08-22T09:41:14.533 に答える
1

<検索操作は(ツリー上の)マップの内部実装に基づいているため、演算子が必要です。線形よりも複雑さをよりよく見つけることができるようにするために、すべての要素と比較する必要はありません。

同様のアルゴリズムの良い例は、二分探索です。サンプルの擬似コードでわかるように、恒等演算子はまったく使用されていません。

于 2012-08-22T09:25:07.083 に答える
1

std::map<T, U>このような動作をするため、多くの操作にファンクターまたはファンクターを使用しますstd::less<T>

動作は異なる場合がありますが、通常、lhsがrhsよりも小さいことを確認します。

于 2012-08-22T09:25:53.420 に答える
0

std::mapは順序付けられたコンテナでoperator <あるため、要素の順序を定義する必要があります。

operator ==の観点から実装されているため、個別は必要ありoperator <ませa==bん。!a<b && !b<a

于 2012-08-22T09:39:23.233 に答える
0

おそらく map がバランスの取れたツリーとして実装されているためです。ハッシュ テーブルが必要な場合は unordered_map を使用します。

于 2012-08-22T09:27:04.787 に答える