0

マップを並べ替えるときに、同等ではなく同等を使用することは悪い習慣です。

//Equality
bool isEqual(const A& a1, const A& a2 ) 
{
   return a1 == a2 ;
} 

ただし、マップしたい非常に複雑なクラスがいくつかあり、これらのクラスに対してoperator ==を定義しましたが、operator<は定義していません。

マップの比較にoperator==を使用しない正当な理由を誰かに教えてもらえますか?私のクラスでそれが壊れてしまう例を考えることはできません(必要に応じてクラスのソースコードを追加できます)

また、ビルドをかじって新しい演算子を書く必要があります<:-/?

私は自分の地図に対してこのようなことをします。

 std::map<A,B,isEqual> ex1;

また

 ex1.find(A);

今、同等性の代わりに平等を使用しますか?

4

1 に答える 1

3

std::mapとその兄弟は C++ 標準に従ってソートされた構造体でstd::setあり、multiソートに等価性を使用できないためです。一方、厳密な弱い順序付けを使用して、等しいかどうかを判断できます。

構造がソートされる理由については、標準では、挿入とルックアップが対数の複雑さであることを要求しています。これは、二分探索ツリーを使用して達成できます。このような構造で等価比較を使用する唯一の用途は、要素の存在をテストすることです。

等値比較のみを行った場合、要素ルックアップは構造をトラバースし、要素が見つかるまで毎回比較を行う必要があり、結果として線形時間の複雑さが生じます。

これをしたら

std::map<A,B,isEqual> ex1;

その場合、マップの比較は厳密な弱い順序付けを満たさないため、マップの並べ替えも要素の検索も機能しません。したがって、悪い習慣というだけでなく、まったく機能しません。operator<比較ファンクターを実装または提供する必要があり、どちらを選択しても厳密な弱い順序付けを実装する必要があります。それを回避する方法はありません。

于 2012-06-21T08:36:25.997 に答える