すぐ忘れるからメモ
#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; });