2013-02-22 3 views
2

У меня есть числовые данные в векторе < < вектор двойной>> и нужно добавить скалярные значения их следующим образом:станд :: преобразование для вектора векторов

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]; 

Конечно, это возможно с двумя для петель. Мне было интересно, можно ли это сделать просто с преобразованием, привязкой и плюсом? Я пытаюсь использовать функторы, где это возможно (хотя по привычке используется старый код стиля С).

Внутренний цикл должен был бы сделать это для вектора 0 в данных:

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

Можно ли заменить данные [0] в этой линии с другой счетчик (в связи с преобразованием данных [0] ..data [N-1])? Это, вероятно, стандартная проблема, но я не мог найти хорошую ссылку.

+2

Использовать 'for_each' и лямбда? – us2012

ответ

6

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

Большое спасибо @ us2012! Является ли квадратная скобка обозначением лямбда? –

+1

Теперь я использую эту конструкцию в своей программе https://code.google.com/p/bias/source/browse/cpp/fastecm/fastecm.cpp - еще раз спасибо! –

2

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

+1 @Johnsyweb! Самое приятное в этом решении заключается в том, что вы можете использовать его для других операторов, кроме как плюс (вам не нужно писать другой трансформатор каждый раз, когда я думаю - это так?) –

+0

Это, безусловно, может быть обобщено. – Johnsyweb

Смежные вопросы