给定二维数组
lapply(list(p.b5.4, p.b6.4, p.b7.4), plot)
我正在寻找其所有元素的总和 - 在这种情况下,21。如果数组是一维的,我可以写
std::array<std::array<int, 2>, 3> m = {{ {1, 2}, {3, 4}, {5, 6} }};
但是对于我的二维数组,这失败了,这是一个可以理解的错误
auto sum = std::accumulate(m.begin(), m.end(), 0);
如何优雅地计算我的2D数组的总和(避免for循环,更喜欢STL算法)?
是否可以像一维情况一样使用单线,或者它变得更复杂?
答案 0 :(得分:19)
它有点复杂。你必须嵌套2 std::accumulate
个电话。嵌套的std::accumulate
调用对嵌套数组中的元素求和,然后第一个std::accumulate
求和。
auto sum = std::accumulate(m.cbegin(), m.cend(), 0, [](auto lhs, const auto& rhs) {
return std::accumulate(rhs.cbegin(), rhs.cend(), lhs);
});
由于泛型lambda,这是一个C ++ 14解决方案,但对于C ++ 11,您只需要明确指定类型。
答案 1 :(得分:7)
从概念上讲,您希望展平数组m
,然后对其应用累积。
使用Range-v3库(或将来的Ranges TS),你可以做到(link to wandbox)。
std::array<std::array<int, 2>, 3> m = {{ {1, 2}, {3, 4}, {5, 6} }};
auto result = ranges::accumulate(ranges::join(m), 0); // flatten range then apply accumulate
这就像Pete Becker在评论中提到的那样:“遍历数组的一行,当它到达行的末尾时,移动到下一行”。没有制作子范围的副本。
答案 2 :(得分:0)
请尝试如下:
std::unique_ptr<int[][Column]> matrix (new int[Row][Column]);
long long total = 0;
for(int i=0; i < Row; i++){
total = std::accumulate(std::begin(matrix[i]),std::end(matrix[i]),total);
}