std::tieによる< (less)

std::mapなどで自作のクラスをキーにする場合、そのクラスはoperator<を定義していなければならない。クラスにメンバーが1つしかない場合は、それを比較するだけで簡単なのだが、2つ以上あるときは少し難しくなる。例えばメンバーa,bがある場合、以下のように書けない。

以下のようなoperator<検証プログラムを書くとassertに引っかかる。

例えば
C(1,6) < C(7,0)

1 < 7 && 6 < 0 で
false

逆にすると
C(7,0) < C(1,6)
7 < 1 && 0 < 6 で
両方falseになってしまう。

ちゃんと書くと以下のようになる。

この書き方だと3つになった場合分けがわからなくなるので、std::tieを使ってスマートに書ける。

アルゴリズムとしては==の代わりに !< を使って1つずつ比較していく。

このような比較はlexicographical_compareといって、イテレータを渡して実現することもできる。このコードでイテレータを渡すのは強引だが以下のようになる。

ソースコード

Leave a Reply

Your email address will not be published. Required fields are marked *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)