std::transform + boost::counting_iterator + boost::lambda

昨日寝る前に上を思いついて半ば興奮状態で書きましたが,一度寝て,起きて冷静に考えてみるとcounting_iterator + transformの方が圧倒的に直感的だという結論が出ました.lambdaも直接書けますし.(´・ω・`)ショボーン.上が有効になるのはiterator範囲による初期化か,iterator範囲によるassignぐらい・・・(しかも後者はあらかじめresizeしてからtransformで良いし).

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;
using namespace boost;
using namespace boost::lambda;

int main(int argc, char *argv[])
{
  cout << "a_n = 3n (n = 0, 1, 2,...)" << endl;
  transform(
    make_counting_iterator(0),
    make_counting_iterator(20),
    ostream_iterator(cout, ", "),
    _1 * 3);
  cout << endl;
  cout << endl;

  vector > v;
  transform(
    make_counting_iterator(0),
    make_counting_iterator(20),
    back_inserter(v),
    bind(constructor >(), _1 * 2, _1 * 3));

  cout << "a_n = (2n, 3n) (n = 0, 1, 2,...)" << endl;
  for(vector >::iterator i = v.begin(); i != v.end(); ++i){
    cout << '(' << i->first << ',' << i->second << ')' << ", ";
  }
  cout << endl;
  cout << endl;

  // 参考:コンテナの要素から特定のメンバの値だけ,
  // あるいはメンバ関数の返り値だけを他のコンテナにコピーする
  cout << "a_n = 2n (n = 0, 1, 2,...)" << endl;
  transform(
    v.begin(), v.end(),
    ostream_iterator(cout, ", "),
    &_1 ->* &pair::first); // lambdaによるメンバ選択の書き方
  cout << endl;

  return 0;
}

自分で言うのもなんですが、変態チックにできました.(@風子)