如何在c++中对2d数组中的列求和

How to sum up columns in a 2d array in c++?

本文关键字:求和 数组 2d c++ 中对      更新时间:2023-10-16

我必须制作一个程序,将2d数组的列相加,并返回最小的和。这是我写的程序,但我想知道是否有更有效的方法。主程序是教授给我们的。我想知道是否有一种方法可以做到这一点,而不必为每列声明一个整数,因为如果不是总是3列,那该怎么办,谢谢。

   #include <iostream>
   #include <string>
   using namespace std;
   int smallCol( int x[][3], int row, int col){
    int c1 = 0;
    int c2 = 0;
    int c3 = 0;
    int min;
    for (int r = 0; r < row; r++){
        for(int c = 0; c < col; c++ ){
            if(c==0)
                c1 += x[r][c];
            if(c==1)
                c2 += x[r][c];
            if(c==2)
                c3 += x[r][c];    
            }

        }
    min = c1;
    if(c2 < c1)
        min = c2;
    if(c3 < c2)
        min = c3;
    return min;    
}

  int main() {
  int x[2][3] = {{3, 1, 4}, {1, 5, 9}};
  cout << "Smallest column sum is " << smallCol (x, 2, 3) << endl;
  // from the 2-d array x that has size 2 x 3, find the smallest col sum
  // output will be 4 since col#0 contains 3 and 1 is smallest.
  return 0;
  } 

更改嵌套循环的顺序,以便首先在列上循环,并计算该列中所有行的总数。那么,您就不需要为每列的合计设置一个变量。

int min;
for (int c = 0; c < col; c++) {
    int total = 0;
    for (int r = 0; r < row; r++) {
        total += x[r][c];
    }
    if (c == 0 || total < min) {
        min = total;
    }
}

c == 0测试使第一列受到特殊处理,因此它将min初始化为第一列的总和。其余列将与之进行比较。

如果切换嵌套循环,则只能使用一个变量:

#include <limits>
int smallCol( int x[][3], int row, int col){
    int min = std::numeric_limits<int>::max();
    // or something really big... like 2147483647
    for (int c = 0; c < col; ++c ) {
        int sum = 0;
        for(int r = 0; r < row; ++r ) {
            sum += x[r][c];
        }
        if ( min > sum ) {
            min = sum;
        }
    }  
    return min;    
}

编辑

如果你不能按照分配的方式修改程序的主要结构,你可以使用向量来存储部分总数,然后扫描它以找到最小值:

std::vector<int> sums(col);
for (int r = 0; r < row; ++r ) {
    for(int c = 0; c < col; ++c ) {
        sums[c] += x[r][c];
    }
}
for( int c = 0; c < col; ++c ) {
    if ( min > sums[c] ) {
        min = sums[c];
    }
}

对于非常大的矩阵,这可能也更适合缓存,因为内存中元素的邻接性,从而产生更快的代码。

int smallCol
{
    auto min = std::numeric_limits<int>::max();
    for (auto i = 0; i < col; ++i)
    {
        auto m = std::accumulate(x, x + row, 0, [i](int sum, auto && row) { return sum + row[i]; });
        if (m < min) min = m;
    }
    return min;
}