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
*/
以上のようにして比較関数を書いて、自分の好きなようにソートすることができる。