有一个函数从开头到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;
}
如何优化此功能?
答案 0 :(得分: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;
}
这甚至适合在原地工作,所以如果来电者不介意丢失源矢量,它可以避免额外的分配。
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);
}
}
答案 1 :(得分:4)
std::vector<double> f(const std::vector<double> &v)
{
std::vector<double> ret(v.size());
std::partial_sum(v.begin(), v.end(), ret.begin());
for (size_t i = 0; i < ret.size(); ++i) {
ret[i] /= i + 1;
}
return ret;
}