【问题标题】:std::transform for a vector of vectorsstd::transform 用于向量的向量
【发布时间】:2013-02-07 12:15:06
【问题描述】:

我在一个向量>中有数值数据,需要给它们添加标量值,如下所示:

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] 上的转换有关)? 这可能是一个标准问题,但我找不到很好的参考。

【问题讨论】:

  • 使用 for_each 和 lambda?

标签: c++ vector nested range transform


【解决方案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>() );
                } 
             );

【讨论】:

  • 非常感谢@us2012!方括号表示法是 lambda 吗?
【解决方案2】:

如果您没有可用的 lambda,您可以实现一个仿函数来转换每个 vector&lt;double&gt;

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 的调用中使用它作为您的vectorvector&lt;double&gt;

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

【讨论】:

  • +1 @Johnsyweb!这个解决方案最酷的地方在于,除了 plus 之外,您还可以将它用于其他运算符(我猜你不需要每次都编写不同的转换器—​​—对吗?)
  • 这当然可以概括。
猜你喜欢
  • 2016-03-01
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 2014-02-27
  • 2022-06-22
相关资源
最近更新 更多