STLのalgorithm,functor 関連をシンプルに整理してみました.
以下,文中の
- op は関数オブジェクト
- T, T1,T2 はtypename
- a, b はT型の定数
- x, y はT型の変数 or 定数
- Ite,first, last はイテレータ
とします.
equal_to, not_equal_to, greater, less, greater_equal, less_equal
書式 | 生成されるコード |
greater |
x > y |
less |
x < y |
greater_equal |
x >= y |
less_equal |
x <= y |
equal_to |
x == y |
not_equal_to |
x != y |
bind1st, bind2nd
書式 | 生成されるコード |
bind1st |
op(a, x) |
bind2nd |
op(x, a) |
select1st, select2nd
書式 | 生成されるコード |
select1st< pair |
x.first |
select2nd< pair |
x.second |
compose1(unary_compose), compose2(binary_compose)
書式 | 生成されるコード |
compose1 |
op1(op2(x)) |
unary_compose |
op1(op2(x)) |
compose2 |
op1(op2(x), op3(x)) |
binary_compose |
op1(op2(x), op3(x)) |
bind2nd() の使用例
#include <iostream> #include <algorithm> #include <functional> using namespace std; int main() { int data[]={10,1,-5,121,-21,0}; int *p = find_if(&data[0], &data[sizeof(data)/sizeof(data[0])], bind2nd(greater<int>(), 20)); cout << *p << endl; return 0; }
compose1, select1st の使用例
compose1, select1st はSGIによる独自拡張ですが,例えばgccであれば
#include <functional>
の代りに
#include <ext/functional> using namespace __gnu_cxx;
と書けば,SGIの独自拡張も使えるようになります.
#include <iostream> #include <algorithm> #include <map> #include <ext/functional> using namespace __gnu_cxx; using namespace std; int main() { typedef map<int, float> data_t; data_t data; data[0] = 1.2; data[1] = 1.5; data[2] = -1.1; data[20] = 3.1; data[-12] = 0; data_t::iterator ite = find_if(data.begin(), data.end(), compose1(bind2nd(greater<int>(), 2), select1st<data_t::value_type>() )); cout << (*ite).first << endl; return 0; }