ラムダをサポートするコンパイラがない限り、これをアルゴリズムの1つを使用するように変更しません。それは書かれているように完全に明確です。あなたのコンパイラがlambdaをサポートしていたとしても、おそらくこのコードを変更しないでしょう。
比較的単純な選択肢の1つは、平坦化イテレータを書くことです。私はan answer to another questionにデモンストレーション用のものを書いた。
あなた本当にはワンライナーをしたいとbind
使用することができた場合は(C++ 0xのからブーストからboost::bind
、TR1からstd::tr1::bind
、そしてstd::bind
をするすべての仕事)、そしてここにそれがどのように見えるかです。私は事前に警告します:それは恐ろしいです。
編集:これは技術的にも違法です。標準ライブラリメンバ関数の型は指定されていないので、そのようなメンバ関数のアドレスを(移植可能にまたは正しく)取り込むことはできません。あなたはが正しく標準ライブラリのメンバ関数のアドレスを取ることができれば、これは、それは次のようになります。それは、単一のステートメントであるよう
typedef std::vector<int>::iterator (std::vector<int>::*IteratorGetter)();
std::for_each(int_vectors.begin(), int_vectors.end(),
std::bind(
std::bind(
&std::vector<int>::insert<std::vector<int>::iterator>,
&ints,
std::bind((IteratorGetter)&std::vector<int>::end, &ints),
_1,
_2
),
std::bind((IteratorGetter)&std::vector<int>::begin, _1),
std::bind((IteratorGetter)&std::vector<int>::end, _1)
)
);
(はい、それは技術的に一つの「コード行」です。私が抽出した唯一のものは、オーバーロードされたbegin
とend
関数を明確にするために使用されるポインタへのメンバ関数型のtypedefであり、必ずしもtypedefする必要はありませんが、コードはスタックオーバーフローで水平スクロールが必要です)
私はSTLアルゴリズムとブーストについてもっと学びたいと思っています! –