C++で構造体の比較演算子をオーバーロードする

はじめに

C++でプログラムを作成するとき,構造体を使って複数のデータの組を扱うことがあります.
演算子のオーバーロードを使うと,例えば構造体どうしの足し算などを定義できます.この機能を使うと,わかりやすく簡潔なプログラムを作成できます.
このページでは,構造体の比較演算子(==演算子や<演算子など)のオーバーロードについて解説します.

構造体の比較演算子をオーバーロードしたい場面

構造体の比較演算子のオーバーロードは,例えば次のような場面で使います.

  • 構造体の配列をソートするとき
  • 優先度付きキューで構造体を取り扱うとき
  • 構造体をmapのKeyとして使うとき

ここで取り上げた例は,いずれもSTLの関数やコンテナで構造体を取り扱うというものです.
STLのsort関数を使うにせよ,priority_queueやmapを使うにせよ,大小比較が可能な型(演算子<が定義されている型)である必要があります.
そのため,演算子のオーバーロードにより構造体の大小比較ができるようにする必要があるのです.

構造体の比較演算子をオーバーロードする方法


上記のコードのように,構造体のメンバ関数として演算子オーバーロードを定義する方法(構造体の中で演算子オーバーロードを定義する方法)と構造体の外で演算子オーバーロードを定義する方法があります.
operatorの後ろに記述する比較演算子(この例では小なり記号 < )を別のものに置き換えれば,他の比較演算子もオーバーロードできます.

使用例

ソート


上記のコードのように,構造体の比較演算子をオーバーロードすればint型などの配列をソートするときと同様の書き方で構造体の配列をソートできるようになります.
STLのsort関数を使う場合,デフォルトでは昇順でソートされます.降順でソートしたい場合(処理順を変えたい場合)は,sort関数側で greater<型>()
を使います.この場合は,構造体側では比較演算子<(大なり記号)をオーバーロードする必要があります.

優先度付きキュー


優先度付きキューを利用する場合も,構造体の比較演算子をオーバーロードすればint型などのデータを管理する場合と同様の書き方で優先度付きキューを使えるようになります.
STLの優先度付きキューを使う場合,要素は降順で取り出されます.


こちらはAOJのGRL_1_A 単一始点最短経路の解答例となるソースコードです.ダイクストラ法を実装するときには要素を昇順で取り出せる優先度付きキューが欲しくなるので,構造体の比較演算子をオーバーロードして対応しています.
優先度付きキューの処理順を変更したい場合は,上記のコードのような書き方をします.また,このとき構造体側では比較演算子<(大なり記号)をオーバーロードする必要があります.