C++ algorithm sort関数の仕様を確認してみる

これの仕様を理解していなかったために、本来点数稼げる問題を落としてしまったので確認・・・今まで数字に対してしか使ってなかったことを思い出しました・・・くそぅ・・・。

まずは簡単にプログラムかいてみます。

 

こちらを実行すると、標準出力に”0.jpg”, “1.jpg”, “2.jpg”, “3.jpg”……”99.jpg”までが出力されます。数字のほうは、ランダムにしました。0-100の間でランダムな数字が配列に格納されます。

ここで出力されている配列に、それぞれalgorythm::sort()を噛ませると、配列はどのようにソートされるのか、ということを確認したいと思います。

プログラムを以下のように変えて実行します。

sortした後に、もう一度、配列全体を出力する処理を加えました。

ここで出力を確認します。

数字のほうは、ランダムに生成された数字が、昇順に並び替わってるのがわかると思います。それに対して文字列に対しては、どのように出力されているでしょう。Screen Shot 2013-02-20 at 12.35.53

すいません、これ知ってる人からしたら「今更なに言ってるんだ(笑)」なんでしょうけど、僕、最初は”1.jpg”, “2.jpg”, “3.jpg”….ってなると思ってました・・・。なるわけないですよね・・・文字列ですから・・・。単刀直入に言うと、「辞書順」にソートされます。10の後に11ではなく、100が19の後に20ではなく、2がきていますね。とても基礎的な部分なんでしょうが、これを理解していない為に、解けなかった問題があったのでメモしておきます。

ちなみに降順にソートしたい場合はsort()の第三引数にfunctional::greater<T>()を与えてあげればOKです。最後にそれを加えたソースがこちら。

algorythm.hは強力ですね。ちなみに第三引数は自分でソート順を定義することも可能だそうで、それはいづれまた必要になったときに改めて記事書いてみます。あぁ・・・悔しい・・・

今回のコード

 

———————2013/02/24 追記———————–

デフォルトではsort()関数は昇順にソートしますが、降順にソートしたい場合はfunctional::greaterを利用すると記述しましたが、AOJで他の参加者の方のコードを見せていただいたら以下のようにも降順ソートできるみたいです!functional.hをインクルードする必要もないので、単純に降順ソートしたい場合は便利ですね。

イテレータをそれぞれ最初の文字を末尾に、最後の文字を頭にもってきてあげてますね。so cool!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です