pairインスタンスの作成ルール化事例

やあ子供たち、元気にしてたかな、おじさんが日記を久しく書かない間に、今日本はとても大変な試練の時を迎えているね。みんなも病気や怪我にだけは気をつけて、一刻も早く日常を取り戻すべく、頑張ろう。プログラミングで国の復興に貢献するってのも全くできないわけじゃないと思うぞ。

今回紹介するのは std::pair オブジェクトの作成機の一種だよ。よく、同じ型の二つの値を静的な対、( X, Y )として憶えておきたいとき、( A, B )と、( B, A )とは同じと見なしたい場合がある。しかし、これをやみくもに、

 pair< T, T > pr1 = std::make_pair( A, B );
 pair< T, T > pr2 = std::make_pair( B, A );
 // pr1 != pr2

としてそれぞれ作成したものを比較すると、当然別物として扱われてしまうね。じゃどうするか。pair< T, T > に( A, B )と( B, A )が来てもそれらを同じと見なせるような独自のイコール演算子を導入する?動的ならまだしも静的な場合なのに?まさかまさか!そんな実装は電力の無駄になりかねないからやめてくれよな。
ここはひとえに、「静的な対情報を作成する際のルールとして、必ず小さい方、大きい方の順に並べて pair を作成するようにする」ということにしておけばそれでいいだけなのだ。そだろ?な!
なので以下のようなコードだけでそれは遍く型の値ペアの作成に対応できるよ。

template< class T >
pair< T, T > make_ordered_pair( const T& a, const T& b )
{
	pair< T, T > result;
	if( a < b ){
		result = make_pair( a, b );
	}else{
		result = make_pair( b, a );
	}
	return result;
}

うっと、もちろんTには<演算子が定義されている必要があるがな。
三項演算子とかでもっと短く書けるかな。まあそういうことだ。標準でもこういうのあればよかったんだけどな。もしおじさんが知らないだけでこういうのが標準であるのなら教えてくれよな。じゃっ!