是否有任何数据类型或方法可以计算当前单元格中先前数组单元格的总和
Is there any datatype or method that calculates the sum of previous array cells in the present cell?
例如,如果给定的数组是
1,6,3,2,7.
我想以下面给出的方式将其存储在数组中:
其中 a[2]=a[1,7,10,12,19
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];
相关文章:
- C++:在多个线程中访问同一数组/向量的不同单元格是否会产生数据竞赛?
- 当我使用需要计算数组单元格地址的模板时,奇怪的C++行为
- 2D 数组,某些单元格保存特定数据
- C++ 2D 数组在调用附近的小区时循环到行中的第一个单元
- 索引和访问 mex 函数中单元数组和矩阵的元素
- 瓦尔格林德内存泄漏与动态数组C++
- 是否有任何数据类型或方法可以计算当前单元格中先前数组单元格的总和
- 在带有单元格数组的C 特征矩阵和MATLAB MXARRAY之间传递数据
- 将两个值添加到数组的单元格中
- 为什么数组单元格可以超过数组长度
- 如何知道数组中两点之间的单元格数
- 是否可以将两个数字放在数组的一个单元格中
- 为C++中的每个单元格创建一个只有 2 位的数组
- 分配一个由999999999个单元格组成的数组|C++
- 数组单元格显示错误
- 我不希望我的 Excel 加载项返回数组(相反,我需要 UDF 来更改其他单元格)
- 从数组中删除单元格给我运行时错误
- 通过翻转单元格组来用零填充二维数组
- 创建一个1D数组,每个单元格有两个变量
- 如何按特定单元格对二维数组进行快速排序?