web-dev-qa-db-ja.com

C ++ 0xラムダ式を使用したstd :: transform

これはC++ 0xではどのように行われますか?

std::vector<double> myv1;
std::transform(myv1.begin(), myv1.end(), myv1.begin(),
               std::bind1st(std::multiplies<double>(),3));

元の質問と解決策は here です。

32
Steve Townsend
std::transform(myv1.begin(), myv1.end(), myv1.begin(), 
   [](double d) -> double { return d * 3; });
35
Edward Strange

C++でこれらのケースにその関数スタイルを使用する主な元の動機は「aaagh!イテレーターループ!」であり、C++ 0xは範囲ベースのforステートメントでその動機を取り除きます。質問の要点の一部はラムダ構文を見つけることであったことは知っていますが、「C++ 0xでこれをどのように行うのですか?」です:

for(double &a : myv1) { a *= 3; }

そこには実際の関数オブジェクトはありませんが、それが役立つ場合は、その{ a *= 3; }は非常に省略されたラムダです。ドラフト標準では、同等のforループに関して範囲ベースのforが定義されていますが、使いやすさの点ではどちらでも同じです。

29
Steve Jessop

ダリオが言うようにしてください:

for_each(begin(myv1), end(myv1), [](double& a) { a *= 3; });

for_eachは要素を変更することが許可されており、それは神話ではあり得ないと述べています。

28
GManNickG

このような:

vector<double> myv1;
transform(myv1.begin(), myv1.end(), myv1.begin(), [](double v)
{
    return v*3.0;
});
5
John Dibling

C++ 11バインドアダプターをサポートするVS2012を使用しています。バイナリ関数の最初の要素をバインドするには(bind1stが使用するように)、_ 1(プレースホルダー引数)を追加する必要があります。 bindの機能を含める必要があります。

using namespace std::placeholders;
std::transform( myv1.begin(), myv1.end(), myv1.begin(),
                 std::bind( std::multiplies<double>(),3,_1));
1
Elligno