如何在std :: transform中使用std :: pow作为一元函数?

时间:2018-09-07 19:28:34

标签: c++ std pow

我正在尝试编写一个函数,该函数返回向量的第n个范数,其中,函数的输入为n。

double n_norm = N_Norm(std::vector< double > x, double n);

我正在尝试使用std :: transform方法和std :: pow计算输入向量中所有元素的n次幂。

return (std::pow(std::transform(x.begin(), x.end(), x.begin(), std::bind2nd(std::pow<double>(), n)), 1/n));

但是我得到这个错误:

  

没有任何重载函数“ std :: pow”的实例与参数列表匹配。

有人知道我该如何修复一元函数?

2 个答案:

答案 0 :(得分:1)

据我了解,您想写:

double N_Norm(std::vector<double> v, double n)
{
    std::transform(v.begin(), v.end(), [n](double d) { std::pow(d, n); });
    double sum = std::accumulate(v.begin(), v.end(), 0.);
    return std::pow(sum, 1 / n);
}

但这会额外复制向量。

在c ++ 17中,您可以这样做:

double N_Norm(std::vector<double> v, double n)
{
    return std::pow(std::transform_reduce(v.begin(),
                                          v.end(),
                                          0.,
                                          std::plus<>{},
                                          [n](double d){ return std::pow(d, n); }),
                    1 / n);
}

答案 1 :(得分:0)

std::transform不适合此处。您应该使用std::accumulate。 同样,自C ++ 11起,您有了比std::bind1ststd::bind2dstd::bind方便得多的lambda。

double N_NormAcc(const std::vector< double > &v, double n) {
    auto sum = std::accumulate(v.begin(), v.end(), 0.0, [n](auto sum, auto x) { 
        return sum + std::pow(std::fabs(x), n);
    });
    return std::pow(sum, 1.0 / n);
}

https://wandbox.org/permlink/yhJIZrMcgNT9GznF