2011年10月11日火曜日

boost::range 習作3 (reference)

#include <boost/assign.hpp>
#include <boost/bind.hpp>
#include <limits>
#include <iostream>
#include <vector>
#include <boost/range/algorithm/for_each.hpp>
#include <boost/foreach.hpp>
#include <boost/ref.hpp>

struct minmax {
private:
  int max_;
  int min_;
public:
  minmax() : min_(std::numeric_limits<int>::max()), max_(std::numeric_limits<int>::min()) {}
  void operator() (int val) {
    min_ = std::min( min_, val );
    max_ = std::max( max_, val );
  }

  int get_min() const { return min_; }
  int get_max() const { return max_; }

};

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

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

  {
    minmax mm;

    std::cout << "range foreach with functor" << std::endl;
    boost::for_each( input, mm );
    std::cout << mm.get_min() << "," << mm.get_max() << std::endl;
  }
  {
    minmax mm;
    std::cout << "range foreach with bind" << std::endl;
    boost::for_each( input, boost::bind( &minmax::operator(), &mm, _1 ) );
    std::cout << mm.get_min() << "," << mm.get_max() << std::endl;
  }
  {
    minmax mm;
    std::cout << "macro base foreach" << std::endl;
    BOOST_FOREACH( int val, input ) {
      mm( val );
    }
    std::cout << mm.get_min() << "," << mm.get_max() << std::endl;
  }
  return 0;
}

追記:これは、1,9 の集合を返す関数に変形すべき?

0 件のコメント: