C++(ソートの補足)
複数の要素をまとめてソート
複数の要素をまとめてソートしたいときは、pairの配列(vector<pair<型1, 型2> >
)を使うと簡単にできる。
ソートの順序を指定
STLのソートはそのままでは昇順(小さい順)になるが、この順序を別のものにすることもできる。
sort関数にはソートの順序を定める比較関数を指定することができるので、これを使う。
降順に並べるには、functionalヘッダにあるgreater<型>()
を使う。
独自の順序で並べるときは比較関数を自作する必要がある。
比較関数は引数を2つ取り、1番目の引数が2番目の引数よりも「より小さい」(より配列の前方に来る)なら真を返す関数。
引数は値渡しかconst参照(const Hoge&
みたいなの)のどちらかであることに注意。
余談ですが、比較関数としてsort関数に渡すものとしては関数ポインタだけでなく関数オブジェクトを使うこともできます。
関数オブジェクトの方が何かと便利なのですが、記法が面倒なのでICPCではあまり使いません。
structのソート
構造体はそのままでは比較可能ではないので、ソートできない。ソートしたいときは演算子のオーバーロードを使う(もしくは比較関数を使う)。
C++のSTLでは、オブジェクトの比較には暗黙的にoperator<
が使用されている。
この演算子をオーバーロードすることで、組み込み型と同様にソートできるようになる(同様に、max関数やlower_bound関数なども使用できるようになる)。
以下のプログラムは、構造体を使ったソートの例。
問題:標準入力の一行目に人数n
、続くn
行に学生番号・国語の点数・数学の点数が空白区切りで与えられる。 国語の点数が高い順、数学の点数が高い順、学生番号が小さい順にソートしてn人分の学生番号を1行に出力せよ。
入力例:
出力例:
※構造体で保持する変数の数が3つくらいなら、以下のように2重のpairを適用することもできる。
演算子オーバーロードで比較関数を自作する必要がない分楽(ただし、どのようにデータを格納したかは把握しておくする必要がある)。
いや比較関数作った方がわかりやすいかな
比較関数使うならpairにする必要性がないな
好きなものを使ってください…。
演習