STLのalgorithm,functorの使い方.

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) x > y
less()(x, y) x < y
greater_equal()(x, y) x >= y
less_equal()(x, y) x <= y
equal_to()(x, y) x == y
not_equal_to()(x, y) x != y

bind1st, bind2nd

書式 生成されるコード
bind1st()(x) op(a, x)
bind2nd()(x) op(x, a)

select1st, select2nd

書式 生成されるコード
select1st< pair >()(x) x.first
select2nd< pair >()(x) x.second

厳密にはSTL標準では無く,SGIの独自拡張

compose1(unary_compose), compose2(binary_compose)

書式 生成されるコード
compose1()(x) op1(op2(x))
unary_compose()(x) op1(op2(x))
compose2()(x) op1(op2(x), op3(x))
binary_compose()(x) op1(op2(x), op3(x))

厳密にはSTL標準では無く,SGIの独自拡張

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