昨日寝る前に上を思いついて半ば興奮状態で書きましたが,一度寝て,起きて冷静に考えてみると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; }
自分で言うのもなんですが、変態チックにできました.(@風子)