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

Is there any datatype or method that calculates the sum of previous array cells in the present cell?

本文关键字:单元格 数组 计算 数据类型 任何 方法 是否      更新时间:2023-10-16

例如,如果给定的数组是

1,6,3,2,7.

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

1,7,10,12,19

其中 a[2]=a[

1]+a[2] 等等。

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

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

std::vector<int> v{1,6,3,2,7};
std::partial_sum(v.begin(), v.end(), v.begin());

演示

在 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";
}

更新 - 响应循环问题

这是带有 -O2 的 g++ 的输出。

我们可以看到整个转换是在编译时计算的。没有循环(在本例中(。

虽然这是一个极端情况(输入是不可变的,并且在编译时已知(,但它说明了一个有价值的概念 - std::algorithms表达意图而不是实现。编译器和实现可以在幕后做它喜欢的事情,只要接口的保证得到遵守。

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

只需遍历数组即可。使用每次分配值时更新的变量int previous=0;

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