std::变换一个向量



我在向量中有数字数据<向量<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];

当然,这是可能的两个for循环。我想知道它是否可以简单地通过转换、绑定和加号来完成?我正在尽可能地使用函子(尽管出于习惯,我仍然使用旧的C风格代码)。

内部循环需要对数据中的矢量0执行此操作:

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

是否可以将此行中的数据[0]替换为另一个计数器(与数据[0]..数据[N-1]的转换有关)?这可能是一个标准问题,但我找不到一个好的参考。

下面的内容如何,简单地将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>() );
                } 
             );

如果您没有可用的lambda,您可以实现一个函子来转换每个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的呼叫,以获得vector<double>:的vector

transform(data.begin(), data.end(), data.begin(), transformer(scalars));

最新更新