2011年9月7日水曜日

boost::range 習作

ポイント: map の代わりに Loki::AssocVector でも大丈夫か試してみた。 foreach は2種類使ってみた。 0x は、お預け 最初 vv 指定すべきところを、input 指定してコンパイルエラーになるという初歩的ミスを犯してしまった。
#include <boost/range/adaptor/map.hpp>
#include <boost/range/adaptor/filtered.hpp>
#include <boost/assign.hpp>
#include <iostream>
#include <vector>
#include <Loki/AssocVector.h>
#include <boost/foreach.hpp>
#include <boost/range/algorithm/for_each.hpp>

struct is_even {
  bool operator()( int x ) const { return x % 2 == 0; }
};

struct is_bigger {
  int val_;
  is_bigger(int val) : val_(val) {}
  bool operator()( int x ) const { return x > val_; }
};

void disp( int x ) {
  std::cout << x << ",";
}

int main(int argc, const char* argv[])
{
    using namespace boost::assign;
    using namespace boost::adaptors;

    std::vector<int> input;
    input += 1,2,3,4,5,6,7,8,9;

  BOOST_FOREACH( int n, input | filtered(is_even()) ) {
    std::cout << n << ",";
  }
  std::cout << std::endl;

  Loki::AssocVector<int,int> vv;
  for( int i = 1; i < 10; ++i ) {
    vv[i] = i * 10 + i;
  }

  boost::for_each( vv | map_values | filtered(is_even()), disp );
  std::cout << std::endl;
  is_bigger ib( 50 );
  boost::for_each( vv | map_values | filtered(ib), disp );
  std::cout << std::endl;
  is_bigger ib2( 80 );
  boost::for_each( vv | map_values | filtered(ib2), disp );
}

0 件のコメント: