3

vector <vector <double>>に数値データがあり、次のようにスカラー値を追加する必要があります。

vector <vector<double> > data ( M, vector<double>(N) );
vector <double>scalars(N);

data[0][0]     += scalars[0];
data[0][1]     += scalars[1];
...
data[0][N-1]   += scalars[N-1];

data[1][0]     += scalars[0];
data[1][1]     += scalars[1];
...
data[1][N-1]   += scalars[N-1];

...

data[M-1][N-1] += scalars[N-1];

もちろん、これは2つのforループで可能です。変換、バインド、プラスを使用するだけで実行できるかどうか疑問に思いました。私は可能な限りファンクターを使用しようとしています(ただし、習慣から古いCスタイルのコードを使用しています)。

内部ループは、データ内のベクトル0に対してこれを行う必要があります。

transform ( data[0].begin(), data[0].end(), 
            scalars[0].begin(), 
            data[0].begin(), 
            plus<double>() )

この行のdata[0]を別のカウンター(data [0] .. data [N-1]の変換に関連する)に置き換えることは可能ですか?これはおそらく標準的な問題ですが、適切なリファレンスを見つけることができませんでした。

4

2 に答える 2

8

transform次はどうですか、単にあなたをで包みますfor_eachか?

std::for_each( data.begin(), data.end(), 
               [&scalars](std::vector<double>& v) {
                  transform ( v.begin(), v.end(),
                              scalars.begin(),
                              v.begin(), plus<double>() );
                } 
             );
于 2013-02-22T00:25:16.450 に答える
3

利用可能なラムダがない場合は、ファンクターを実装してそれぞれを変換できますvector<double>

struct transformer
{
    transformer(vector<double>& s)
    :s_(s)
    {
    }

    vector<double>& operator ()(vector<double>& v)
    {
        transform(v.begin(), v.end(), s_.begin(), v.begin(), plus<double>());
        return v;
    }

    vector<double> s_;
};

そして、これをあなたのあなたのためのあなたの呼び出しで使用してtransformください:vectorvector<double>

transform(data.begin(), data.end(), data.begin(), transformer(scalars));
于 2013-02-22T00:43:54.067 に答える