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

Boost.Bindでvector<pair<First, Second> >のSecondをキーにして並び替え

C++

すぐ忘れるからメモ

#include <iostream>
#include <algorithm>
#include <vector>
#include <utility>
#include <boost/bind.hpp>

using namespace std;
using namespace boost;

void disp(const pair<int, int>& p)
{
    cout << '[' << p.first << ',' << p.second << ']' << endl;
}

int main()
{
    typedef pair<int, int> value_type;
    vector<value_type> v;

    v.push_back(make_pair(1, 3));
    v.push_back(make_pair(2, 1));
    v.push_back(make_pair(3, 4));

    sort(v.begin(), v.end(), bind(&value_type::second, _1) < bind(&value_type::second, _2));

    for_each(v.begin(), v.end(), disp);
}
[2,1]
[1,3]
[3,4]


C++0x + decltypeで::が使えたらこう書けるんだけど・・・

#include <iostream>
#include <algorithm>
#include <vector>
#include <utility>
#include <functional>

using namespace std;
using namespace std::placeholders;

int main()
{
    vector<pair<int, int>> v;

    v.emplace_back(1, 3);
    v.emplace_back(2, 1);
    v.emplace_back(3, 4);

    sort(v.begin(), v.end(), bind(&decltype(v)::second, _1) < bind(&decltype(v)::second, _2));

    for (const auto& p : v) {
        cout << '[' << p.first << ',' << p.second << ']' << endl;
    }
}

と思ったら、C++0xのbindはoperator<使えないのか。。。
bindの戻り値の型はunspecified-typeとしか書いてないしなー・・・


bindをラムダ式に置き換えるとこうかな。

sort(v.begin(), v.end(),
    [](const pair<int, int>& a, const pair<int, int>& b) { return a.second < b.second; });

長い。うーーん・・・


こう書きたい!

sort(v.begin(), v.end(), [](a, b) { return a.second < b.second; });