昇順ソート
const int n=8; int a[n]={1,3,6,7,4,2,5,8}; vector<int> vec{1,3,6,7,4,2,5,8}; // 昇順 sort(a,a+n); sort(vec.begin(), vec.end()); // C++11以降 // g++なら-std=c++11オプションをつけてコンパイル sort(begin(a), end(a)); sort(begin(vec), end(vec));
降順ソート
sort(vec.rbegin(), vec.rend()); // 負の数にしてソート for(int i=0;i<n;i++) a[i]=-a[i]; sort(a,a+n); for(int i=0;i<n;i++) a[i]=-a[i]; // ソート後に反転 sort(a,a+n); reverse(a,a+n); // greaterを使う sort(a,a+n,greater<int>()); // ラムダ式 C++11以降 sort(vec.begin(), vec.end(),[](int l,int r){return l>r;}); // C++14以降 // g++なら-std=c++14オプションをつけてコンパイル sort(rbegin(a), rend(a)); sort(rbegin(vec), rend(vec));
クラスのソート
struct Hoge { int a,b,c; Hoge(int a,int b,int c) : a(a),b(b),c(c){} // operator を定義する bool operator<(const Hoge &rhs) const { return a<rhs.a; } // Strict Weak Orderというものがあって、うまく定義しないとダメ // http://d.hatena.ne.jp/Cryolite/20040529:embed:cite // 複数のものをソートするにはtuple使うのが便利 bool operator<(const Hoge &rhs) const { return tie(a,b,c) < tie(rhs.a,rhs.b,rhs.c); } // rel_opsなるものがあるらしい(Mi_Sawaさんより) bool operator>(const Hoge &rhs) const { return rel_ops::operator>(*this,rhs); } };