LoginSignup
5
4

More than 5 years have passed since last update.

C++初心者がsortを触ってみる

Last updated at Posted at 2019-04-14

c++には便利なsort関数があります。
最近覚えたのでメモとして残します。
昇順、降順それぞれの記述方法と注意点です。

昇順ソート

vectorに詰まった数字のソートを行います。

昇順sort

  sort(A.begin(), A.end());

降順ソート

続いて降順ソートです。
2通りどちらの書き方でも大丈夫です。

降順sort

//書き方1
sort(A.rbegin(), A.rend());

//書き方2
sort(A.begin(), A.end(),  greater<int>());  

部分ソート

配列を部分的にソートします。
以下は先頭から2要素目までを指定した部分ソートです。

部分sort
  vector<int> A{3,1,4,2,5};

  partial_sort(A.begin(), A.begin() + 2, A.end());  

  for(int i = 0; i < A.size(); i++){
    cout << A[i] << " ";
  }
result
1 2 4 3 5 

注意しなければならないのは、「先頭から2つをソートする」ではなく「先頭から2要素が『配列全体をソートした結果』と同様になるような出力をする」であることです。

私は前者を期待していたために1時間ほど無駄にしました。

注意
//勘違いした私の期待(先頭から2要素だけソート)
3, 1, 4 , 2, 5   --> 1, 3, 4, 2, 5

//現実
3, 1, 4 , 2, 5   --> 1, 2, 4, 3, 5 

先頭から任意の範囲だけソート

vectorは最初に宣言した大きさ以上に要素を詰め込むことができますが、あとから追加した要素については size() やend() が効きません(試してみた感じ多分)。
そのため、きちんと範囲の指定を行う必要があります。
私はこれに気づかずに無駄な時間を費やしたのですが、結果としてこれを利用して部分ソートでの私の失敗を解決することができました。

例)end()を使用
  vector<int> A{3,1,4};
//要素をあとから追加
  A[3]=2;
  A[4]=5;

  sort(A.begin(), A.end());

  for(int i = 0; i < 5; i++){
      cout << A[i] << " ";
  }
結果
//先頭の3つのみソート実行
1 3 4 2 5 

続いて範囲指定をしてソートを実行してみます。

例)begin()から範囲を指定
  vector<int> A{3,1,4};

  A[3]=2;
  A[4]=5;

  //先頭から数えて5つをソート
  sort(A.begin(), A.begin() + 5);

  for(int i = 0; i < 5; i++){
      cout << A[i] << " ";
  }

結果
1 2 3 4 5 

全要素のソートができました。

以上参考まで。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4