読者です 読者をやめる 読者になる 読者になる

sort色々

昇順ソート

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);
    }

};