これはC++ 0xではどのように行われますか?
std::vector<double> myv1;
std::transform(myv1.begin(), myv1.end(), myv1.begin(),
std::bind1st(std::multiplies<double>(),3));
元の質問と解決策は here です。
std::transform(myv1.begin(), myv1.end(), myv1.begin(),
[](double d) -> double { return d * 3; });
C++でこれらのケースにその関数スタイルを使用する主な元の動機は「aaagh!イテレーターループ!」であり、C++ 0xは範囲ベースのforステートメントでその動機を取り除きます。質問の要点の一部はラムダ構文を見つけることであったことは知っていますが、「C++ 0xでこれをどのように行うのですか?」です:
for(double &a : myv1) { a *= 3; }
そこには実際の関数オブジェクトはありませんが、それが役立つ場合は、その{ a *= 3; }
は非常に省略されたラムダです。ドラフト標準では、同等のfor
ループに関して範囲ベースのforが定義されていますが、使いやすさの点ではどちらでも同じです。
ダリオが言うようにしてください:
for_each(begin(myv1), end(myv1), [](double& a) { a *= 3; });
for_each
は要素を変更することが許可されており、それは神話ではあり得ないと述べています。
このような:
vector<double> myv1;
transform(myv1.begin(), myv1.end(), myv1.begin(), [](double v)
{
return v*3.0;
});
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));