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

问题描述 投票:-3回答:2

我正在尝试编写一个函数,它返回向量的第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”的实例与参数列表匹配。

任何人都知道如何修复我的一元功能?

c++ std pow
2个回答
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);
}

0
投票

std::transform不适合这里。你应该使用std::accumulate。此外,从C ++ 11开始,你有lambda,它比std::bind1ststd::bind2dstd::bind更方便。

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

© www.soinside.com 2019 - 2024. All rights reserved.