我有120个元素的向量。我需要每组20个值的总和(总共6组)。我目前正在使用两个嵌套的for循环,如下所示:
for (int j = 0; j < 120; j+=20)
for (int i = j; i < (j +20); i++)
sum += vector[i]
code where I use the sum
仅使用STL有哪些更好(和更快)的方法?
答案 0 :(得分:3)
使用标准库可能在这里不会产生太多(如果有的话)差异,但它可能会使代码变得更整洁:
auto const stride = 20;
for (auto b = vec.begin(); b < vec.end(); b+=stride) {
auto sum = std::accumulate(b, b+stride, 0);
use(sum);
}
答案 1 :(得分:1)
首先,您可以节省6个补充:
for (int j = 0; j < 120; j += 20) {
auto sum = vector[j];
for (int i = j + 1; i < j + 20; i++)
sum += vector[i];
// code which uses the sum
}
其次,您可以使用std :: accumulate,希望您的实现能够以某种方式优化它:
auto it = vector.cbegin();
for (int j = 0; j < 120; j += 20) {
auto itNext = it + 20;
auto sum = std::accumulate(it + 1, itNext, *it);
// code which uses the sum
it = itNext;
}
但是请注意,除非vector
位于缓存中,否则这些或任何其他改进最多只能是微不足道的。在这种情况下,从RAM中读取矢量需要的时间比算术时间长得多。