У меня есть числовые данные в векторе< вектор < 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. Мне было интересно, если это можно сделать так просто с помощью transform, bind и plus? Я пытаюсь использовать функторы, где это возможно (хотя все еще использую старый код в стиле 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>() );
}
);
Если у вас нет лямбды, вы можете реализовать функтор для преобразования каждого 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
из vector<double>
:
transform(data.begin(), data.end(), data.begin(), transformer(scalars));