在C ++中添加连续矢量元素组的最快方法

时间:2016-06-25 04:20:56

标签: c++ vector sum

我有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有哪些更好(和更快)的方法?

2 个答案:

答案 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中读取矢量需要的时间比算术时间长得多。