是否有任何数据类型或方法可以计算当前单元格中先前数组单元格的总和?

时间:2017-03-24 09:49:37

标签: c++ c arrays

例如,如果给定的数组是

  

1,6,3,2,7。

我想以下面给出的方式将它存储在数组中:

  

1,7,10,12,19

其中a [2] = a [1] + a [2]等等。

我可以用这种方式存储任何数据类型或任何可用于计算此数据的方法,而不是使用for循环并计算它。

3 个答案:

答案 0 :(得分:4)

在C ++中,您可以使用std::partial_sum(在<numeric>内):

std::vector<int> v{1,6,3,2,7};

std::partial_sum(v.begin(), v.end(), v.begin());

Demo

答案 1 :(得分:2)

在c ++中,一种方法是使用具有状态变换函数的变换算法。

#include <iostream>
#include <iterator>
#include <algorithm>
#include <array>

int main()
{

    // input data
    int source[] = { 1, 6, 3, 2, 7 };

    // buffer for output data
    auto dest = std::array<int, sizeof(source) / sizeof(source[0])> { 0 };

    // transform operation
    std::transform(std::begin(source),
                   std::end(source),
                   std::begin(dest), [tot = 0](auto&& x)  mutable{ return tot += x; });


    // emit results
    std::copy(std::begin(dest), std::end(dest), std::ostream_iterator<int>(std::cout, ", "));
    std::cout << "\n";
}

更新 - 响应循环问题

这里是g ++与-O2的输出。

我们可以看到整个转换是在编译时计算出来的。没有循环(在这种情况下)。

虽然这是一个极端情况(输入是不可变的并且在编译时已知),但它说明了一个有价值的概念 - std :: algorithms表达意图 not implementation 。如果接口的保证得到尊重,编译器和实现可以做它喜欢的内容。

main:                                   # @main
        push    rax
        mov     edi, std::cout
        mov     esi, 1
        call    std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
        mov     edi, std::cout
        mov     esi, .L.str
        mov     edx, 2
        call    std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
        mov     edi, std::cout
        mov     esi, 7
        call    std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
        mov     edi, std::cout
        mov     esi, .L.str
        mov     edx, 2
        call    std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
        mov     edi, std::cout
        mov     esi, 10
        call    std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
        mov     edi, std::cout
        mov     esi, .L.str
        mov     edx, 2
        call    std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
        mov     edi, std::cout
        mov     esi, 12
        call    std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
        mov     edi, std::cout
        mov     esi, .L.str
        mov     edx, 2
        call    std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
        mov     edi, std::cout
        mov     esi, 19
        call    std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
        mov     edi, std::cout
        mov     esi, .L.str
        mov     edx, 2
        call    std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
        mov     edi, std::cout
        mov     esi, .L.str.1
        mov     edx, 1
        call    std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
        xor     eax, eax
        pop     rcx
        ret

答案 2 :(得分:-1)

简单地遍历数组。使用每次分配值时更新的变量int previous=0;

new_array[i] = old_array[i] + previous;
previous = new_array[i];