例如,如果给定的数组是
1,6,3,2,7。
我想以下面给出的方式将它存储在数组中:
1,7,10,12,19
其中a [2] = a [1] + a [2]等等。
我可以用这种方式存储任何数据类型或任何可用于计算此数据的方法,而不是使用for循环并计算它。
答案 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());
答案 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];