【问题标题】:How to use accumulate function to sum a row of values in a variable array?如何使用累积函数对变量数组中的一行值求和?
【发布时间】:2021-07-16 03:19:37
【问题描述】:

我一直在开发一个程序,我需要能够对二维数组中的行求和,该数组的列数是变量。我还应该补充一点,行“拆分” 为两部分(部分 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);

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

间接需要指针操作数('double'无效')

我认为这是一个语法错误,但改变我定义数组的开始和结束的方式并没有解决这个错误。

【问题讨论】:

  • 您想要发生的事情并不完全清楚。您能否添加一个输入和所需输出的示例?
  • std::accumulate() 的前两个参数是迭代器,它们指向范围的开始和(过去的)结束。您正在传递 stat[MASS][partStart[func]](对于两个参数),它是数组的元素,而不是迭代器。
  • 附带说明,double stat[5][total] 仅在 totalconst 时才是有效的 C++,如果不是,则不能在此处使用 total(如果它有效,它是一个 GCC 扩展)。

标签: c++ multidimensional-array accumulate


【解决方案1】:

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

C++ 中的Iterator 是一个概念,它要求某些操作对您的对象有效,如标准所定义。例如,指针类型通常与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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 2019-06-04
    • 2011-04-06
    • 2022-07-05
    相关资源
    最近更新 更多