常に、意図することを最もよく表すバリアントを使用してください。あれは
の各要素x
に対してvec
、を実行しますbar.process(x)
。
では、例を見てみましょう:
std::for_each(vec.begin(), vec.end(),
std::bind1st(std::mem_fun_ref(&Bar::process), bar));
私たちもfor_each
そこにいます- イッペ。[begin; end)
操作したい範囲があります。
原則として、アルゴリズムははるかに明示的であり、手書きの実装よりも優れていました。しかし、その後 ...バインダー?Memfun?基本的にメンバー関数を取得する方法のC ++内部?私の仕事では、私はそれらを気にしません!また、この冗長で不気味な構文に悩まされたくありません。
今、他の可能性:
for (std::vector<Foo>::const_iterator it = vec.begin(); it != vec.end(); ++it)
{
bar.process(*it);
}
確かに、これは認識すべき一般的なパターンですが、...イテレータの作成、ループ、インクリメント、逆参照です。これらも、私の仕事を成し遂げるために私が気にしないすべてのものです。
確かに、それは(少なくとも、ループwaayより良い最初のソリューションよりも見える体が柔軟かつきわめて明確である)、それでも、それは本当にないことを素晴らしいです。可能性がなければこれを使用しますが、多分...
より良い方法は?
に戻りfor_each
ます。文字通り言うのは素晴らしいことではないかfor_each
とも行う必要がある操作に柔軟であること?幸い、C ++ 0xラムダなので、
for_each(v.begin(), v.end(), [&](const Foo& x) { bar.process(x); })
多くの関連する状況に対する抽象的な一般的なソリューションが見つかったので、この特定のケースでは、絶対的な#1のお気に入りがあることに注意してください。
foreach(const Foo& x, vec) bar.process(x);
本当にそれ以上に明確にすることはできません。ありがたいことに、C ++ 0xは同様の構文が組み込まれています。
map(bar.process, vec)
ただし、副作用のマップは推奨されておらず、マップよりもリスト内包表記/ジェネレータ式が推奨されます)。