2012-03-29 6 views
1

for_eachなどのSTLアルゴリズムを複数の引数に適用できるように、mem_funおよびbind1stなどのような記述が可能ですか?もちろん、1つの引数を除いてすべてが与えられ、それ以外の引数はコンテナ要素によって埋められます。複数の引数にfor_eachなどのSTLアルゴリズムを適用

誰でもこのような例を挙げてください。

答えて

5

あなたが探しているものはstd::bindまたはそのツインboost::bindです。彼らはこのように使用されています

std::vector<int> v = {1,2,3,4}; 
std::transform(begin(v), end(v), begin(v), std::bind(std::plus<int>(), _1, 23)); 

はまた、可能な限りhttps://stackoverflow.com/a/8378613/105672

+0

私は参照してください。それはC++ 11のstlにありますか? –

+0

@littleEinstein - 'std :: bind'はC++ 11の一部です。それを使用できない場合は、[boost](http://www.boost.org)から使用できます。 – birryree

+0

std :: bindもC++ 03であり、boost :: bindはboost(これは持っているか取得している)です。 –

4

ラムダを反復処理するなど、多くの壊れたやり方を見て、私の意見では、非常に明確です。代わりにstd::bindのラムダとPMRの例:

std::vector<int> v = {1,2,3,4}; 
std::transform(begin(v), end(v), begin(v), [](int n) { return n + 23 }); 

ラムダはまた、例えば、かなりより困難バインドや友人としている安心の事態に対処することができます:C++ 11では

std::transform(begin(v), end(v), begin(v), [](int n) { return n * ((double)rand()/RAND_MAX); }); 
+0

私はここで反復処理の方法をたくさん見つけようとしました:http://stackoverflow.com/a/8378613/105672不思議にも十分な'std :: bind'がありません。 – pmr

1

を@pmrがこのように投稿した同じことを行うことができます:

std::vector<int> v = {1,2,3,4}; 
std::transform(begin(v), end(v), begin(v), [](int _1) { return _1 + 23}); 

これを@pmrの解決策と比較してください。

@ pmrソリューションの_1は、私の解決策のラムダのパラメータになります。もちろん、より良い名前を使用することができます(実際には、)。私は_1を使って、どのシンボルが何を意味するのかを比較して理解できるようにしました。

関連する問題