有一个函数从头开始返回所有元素的平均值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)
我该如何优化此功能?
您不需要在每次迭代时从头开始重新计算总和.只需保留一笔运行金额.
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)