如何使用累加函数对变量数组中的一行值求和?



我一直在研究一个程序,我需要能够对二维数组中的行求和,该数组的列数是变量。我还应该补充一点,这些行被"拆分">为两部分(A部分和B部分),其大小取决于用户输入。

我显然可以只使用for循环对一行求和,但我想要一个更优雅的解决方案,也更容易在整个程序中设置。 我偶然发现了数字库中的accumulate函数,但我能够找到的所有示例都是专门针对一维数组的。

这是我的问题代码示例:

total = partNum[PART_A] + partNum[PART_B];
partStart[PART_A] = 0;
partEnd[FUNC_A] = partNum[PART_A];
partStart[PART_B] = partNum[PART_A];
partEnd[FUNC_B] = total;
double stat[5][total];
double mass_sum = 0.0
func = PART_A;
accumulate(stat[MASS][partStart[func]], stat[MASS][partStart[func]], mass_sum);

但是,我收到一个构建时错误,指出:

间接寻址需要指针操作数("双精度"无效")

我认为这是一个语法错误,但是更改我定义数组开始和结束的方式对修复错误没有任何帮助。

accumulate的第一个参数是函数将用于迭代范围的迭代器,但您传递的是数组的实际元素

C++ 中的迭代器是一个概念,它要求某些操作在您的对象上有效,如标准所定义的那样。例如,指针类型通常与LegacyRandomAccessIterator匹配,这意味着您基本上可以使用它们作为类似数组的对象(您可以使用++递增它们,您可以使用*间接它们,您可以使用[]访问位置i的元素,等等)。我不会详细介绍什么是C++迭代器,因为这是一个完整的主题,你可以找到大量的参考资料,特别是在我提供的两个链接上。

回到你的问题,你想要的是accumulate迭代器到你的行的开头和结尾,或者你的子范围的开始和结束。有两种方法可以执行此操作:

  • 取元素stat[MASS][partStart[func]]的地址,即&stat[MASS][partStart[func]],它将为您提供范围的开始,然后&stat[MASS][partEnd[func]]将为您提供范围的结束。这是有效的,因为statdouble stat[5][total],访问运算符([])给你一个引用(一个double&),你可以取它的地址,并且行上的元素在内存中是连续的(这不适用于列)。
  • 使用stat[MASS] + partStart[func]stat[MASS] + partEnd[func]。在这种情况下,你取行的开头(stat[MASS]),它是(或隐式转换为)指向双精度(double*)的指针,并将该指针递增partStart[func]partEnd[func],从而为您提供行中所需元素的地址。

所以基本上:

std::accumulate(&stat[MASS][partStart[func]], &stat[MASS][partEndfunc]], mass_sum);
// or
std::accumulate(stat[MASS] + partStart[func], stat[MASS] + partEnd[func], mass_sum);

最新更新