std :: transform для вектора векторов

У меня есть числовые данные в векторе< вектор < 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])?
Вероятно, это стандартная проблема, но я не смог найти хорошую ссылку.

3

Решение

Как насчет следующего, просто оборачивая 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>() );
}
);
7

Другие решения

Если у вас нет лямбды, вы можете реализовать функтор для преобразования каждого 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));
2

По вопросам рекламы [email protected]