#include <iostream> #include <vector> #include <algorithm> // for_each, generate に必要 #include <numeric> // transform に必要 #include <functional> // bind1st に必要 using namespace std; typedef int Type; // なんでもいいけど取り扱う型 inline const Type gen_func(void) // コンストラクター用関数 { static Type x(0); return x++; } class Aclass // クラス Aclass のインターフェイス { protected: vector<Type> v; public: Aclass(const int size); // コンストラクター void Calc(void); // 「計算しろ」 void Output(void); // 「v を出力しろ」 const Type Func(const Type x) { return x * x; } // これで transform }; inline Aclass::Aclass(const int size) : // コンストラクター v(vector<Type>(size)) { generate(v.begin(), v.end(), gen_func); } inline void Aclass::Calc(void) // v のそれぞれの要素を Aclass::Func で変換する { transform( v.begin(), v.end(), v.begin(), bind1st(mem_fun(&Aclass::Func), this) // !!! STL の呪い !!! ); } inline void output(const Type& x) // for_each で出力させるための関数 { cout << " " << x; } inline void Aclass::Output(void) { for_each(v.begin(), v.end(), output); cout << endl; } // ----------------------------------------------------------------------------- int main (void) { Aclass a_class(10); a_class.Output(); a_class.Calc(); a_class.Output(); return 0; } // ----------------------------------------------------------------------------- // 実行すると // // 0 1 2 3 4 5 6 7 8 9 // 0 1 4 9 16 25 36 49 64 81 // // というような結果出力が得られる // -----------------------------------------------------------------------------