0

これは面接の質問です。

サンプルコードを参照すると、使用するために演算子の1つをオーバーライドする必要があります std::set<Value>

 #include<iostream>

 class Value
 {
      std::string   s_val;
      int           i_val;
  public:
      Value(std::string s, int i): s_val(s) , i_val(i){}
 };

 // EOF

 /*
 a       operator !=
 b       operator >
 c       operator <=
 d       operator >=
 e       operator <
 */

実際、ここで演算子をオーバーライドする必要がある理由がわかりません。「set」は重複する要素を許可しません。おそらく演算子!=をオーバーライドする必要がありますか?

4

4 に答える 4

5

演算子をオーバーライドする必要はありませんstd::setクラステンプレートを使用すると、テンプレートパラメータとして比較関数を提供できます。ただし、演​​算子を提供する場合、必要なのはbool operator<()です。この演算子は、厳密な弱順序を実装する必要があります。このstd::setのドキュメントを参照してください。

厳密な弱順序が使用される理由は、setが順序付けられたコンテナーであり、通常は自己平衡二分木として実装されるためです。したがって、2つの要素が同じであるかどうかを知るだけでは十分ではありません。セットはそれらを注文できなければなりません。また、less演算子またはコンパレータファンクタは、要素の同等性をテストするためにも使用されます。

于 2012-06-03T17:11:24.470 に答える
2

タイプに合わせて実装する必要がありoperator<ます。実装は、やなどの標準ライブラリの連想コンテナで使用できるようにするために、ストリック弱順序に従う必要がありますstd::setstd::map

について読む:

ここでの例:

于 2012-06-03T17:12:18.190 に答える
1

セットは、同等性の概念を必要とせずに、operator=または使用することによって、重複を防ぎます。operator!=どちらも他方よりも小さい場合、2つの項目は同等です。

if (!(a < b || b < a))
    // equivalent!
于 2012-06-03T17:15:08.337 に答える
0

重複しない要素の適用を高速化し、通常、要素が通常はある種のツリーにあり、演算子<のみが必要かどうかを確認します。(lessの唯一の使用法は標準によって強制され、残りは単なる平均的な実装です)

于 2012-06-03T17:12:05.437 に答える