簡體   English   中英

std::transform 用於向量的向量

[英]std::transform for a vector of vectors

我在 vector< vector < 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>() )

是否可以將這一行中的 data[0] 替換為另一個計數器(與 data[0]..data[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 vector<double>

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM