2013-02-22 132 views
2

我有在載體中的數值數據<矢量<雙>>和需要標量值如下添加到它們:的std ::變換矢量的矢量

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] ..data [N-1])? 這可能是一個標準問題,但我找不到一個好的參考。

+2

使用'for_each'和lambda? – us2012 2013-02-22 00:20:29

回答

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!方括號表示lambda? – 2013-02-22 11:38:20

+1

我現在在我的程序https://code.google.com/p/bias/source/browse/cpp/fastecm/fastecm.cpp中使用此構造 - 再次感謝! – 2013-05-15 07:43:53

2

如果你沒有提供給您的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_; 
}; 

並使用這個在您的來電transformvector<double>vector

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

+1 @Johnsyweb!這個解決方案很酷的地方在於,你可以將它用於其他運算符而不是plus(你不需要在每次我猜測時都寫一個不同的變換器 - 是嗎?) – 2013-02-22 11:41:33

+0

這當然可以推廣。 – Johnsyweb 2013-02-22 23:11:16