LoginSignup
16
9

More than 3 years have passed since last update.

C++で好きなようにソートしたい

Last updated at Posted at 2020-09-04

C++で自分の思う用にソートしたかったのでメモ。
なにもしないと、

vector<int> v;
sort(v.begin(),v.end()); //昇順

vector<string> s;
sort(s.begin(),s.end());//辞書順

vector<pair<int,int>> p; 
sort(p.begin(),p.end());//firstの昇順

となる。

これを例えば、文字数の昇順にしたいとか、pairの(first-second)の差の昇順にしたいとか、いろんな基準でソートしたくなるときがあると思う。

やり方は、sort()の第3引数で、比較関数を設定するというものだ。

例えばvector<int>を降順で書きたい時はデフォルトでstd::greater()という比較関数が用意されているので、これを指定してあげる。

vector<int> v;
sort(v.begin(),v.end(),std::greater<int>()); //昇順

といった具合だ。

要するに、自分の好きな用に比較関数を書いてあげれば良い。

今からの例ではvector<string>を文字数の昇順でソートするための比較関数を書いて説明する。

書き方は至ってシンプルで、

bool compare(string& s1,string& s2){return s1.size()<s2.size();}

とかくと昇順の比較関数になる。

第一引数 < 第二引数 がtrueになるように書くと昇順、その逆に書くと降順になる。

#include<bits/stdc++.h>
using namespace std;

bool compare(string & s1, string& s2) {return s1.size() < s2.size();}

int main()
{
    vector<string> s{"takahasi","aoki","tanaka","SnukeinAtcoder","Snuke"};

    sort(s.begin(),s.end(),compare );

    for(auto ss:s)cout<<ss<<endl;

    return 0;
}

/*出力
aoki
Snuke
tanaka
takahasi
SnukeinAtcoder
*/

また、ラムダ式で書くこともできその場合は以下のようになる

#include<bits/stdc++.h>
using namespace std;
int main()
{
    vector<string> s{"takahasi","aoki","tanaka","SnukeinAtcoder","Snuke"};


    auto compare=[](string & s1, string& s2) {return s1.size() < s2.size();};

    sort(s.begin(),s.end(),compare );

    for(auto ss:s)cout<<ss<<endl;

    return 0;
}
/*出力
aoki
Snuke
tanaka
takahasi
SnukeinAtcoder
*/

ラムダ式を埋め込んでも良い

#include<bits/stdc++.h>
using namespace std;
int main()
{
    vector<string> s{"takahasi","aoki","tanaka","SnukeinAtcoder","Snuke"};

    sort(s.begin(),s.end(),[](string & s1, string& s2) {return s1.size() < s2.size();} );

    for(auto ss:s)cout<<ss<<endl;

    return 0;
}
/*出力
aoki
Snuke
tanaka
takahasi
SnukeinAtcoder
*/

以上のようにして比較関数を書いて、自分の好きなようにソートすることができる。

16
9
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
16
9