如何优化获得数组的平均值?

Ufx*_*Ufx 1 c++ optimization

有一个函数从头开始返回所有元素的平均值i + 1.

std::vector<double> f(const std::vector<double> &v)
{
    std::vector<double> ret(v.size());

    for (size_t i = 0; i < v.size(); ++i) {
        ret[i] = std::accumulate(v.begin(), v.begin() + i + 1, 0.0) / (i + 1);
    }

    return ret;
}
Run Code Online (Sandbox Code Playgroud)

我该如何优化此功能?

Mat*_*lia 6

您不需要在每次迭代时从头开始重新计算总和.只需保留一笔运行金额.

std::vector<double> f(const std::vector<double> &v)
{
    std::vector<double> ret(v.size());

    double cur = 0.;
    for (size_t i = 0; i < v.size(); ++i)
    {
        cur += v[i];
        ret[i] = cur / (i + 1);
    }

    return ret;
}
Run Code Online (Sandbox Code Playgroud)

这甚至适合在原地工作,所以如果调用者不介意丢失源向量,它可以避免额外的分配.

void f_inplace(std::vector<double> &v)
{
    double cur = 0.;
    for (size_t i = 0; i < v.size(); ++i)
    {
        cur += v[i];
        v[i] = cur / (i + 1);
    }
}
Run Code Online (Sandbox Code Playgroud)