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