如何处理二维数组

how to handle the two dimensional array

本文关键字:二维数组 处理 何处理      更新时间:2023-10-16
    void printMatrix(int matrix[][], int edge)
{
    int i,j;
    for (i=0; i<edge; ++i) {
        for (j=0; j<edge; ++j) {
        std:cout<<matrix[i][j]<<" ";
        }
        std::cout<<std::endl;
    }
}

如果我在 Java 中这样做似乎很好,但在 C++ 中,它表明指向不完整类型'int []'

将多维数组传递给函数时,必须填写除第一个维度之外的所有维度。那是arr[][X], arr[][X][Y], ....

编译器知道如何根据维度进行数组位置数学运算。例如,arr[][5] 表示每行包含 5 个元素,因此arr[2][0]从一开始就采用 10 个元素。所以第一个维度不是必需的,但所有其他维度都是必需的。

你根本不应该使用原始数组。 std::array好多了。如果希望大小不是类型的一部分,则应使用 std::vector 。在某些情况下,您可能需要使用原始数组或原始指针,但这不是您作为初学者应该担心的事情。

下面是如何执行操作的示例(假设 C++11 支持)。这也使用了常量正确性和新的 foreach 功能。我不记得确切的语法,但它应该看起来像这样。

void printMatrix(const std::vector<std::vector<int>> matrix)
{
    for(const auto& row : matrix){
        for(int x : row){
            std::cout << x << " ";
        }
        std::cout<<std::endl;
    }
}

C++ 不传递数组的大小或维数,它只传递数组开头的地址(即指针)。您可以通过使用带有引用的模板函数来解决此问题。这样,矩阵的大小在编译时是已知的。

template<int X, int Y>
void printMatrix(int (&matrix)[X][Y], int edge)
{
    int i,j;
    for (i=0; i<edge; ++i) {
        for (j=0; j<edge; ++j) {
        std:cout<<matrix[i][j]<<" ";
        }
        std::cout<<std::endl;
    }
}

如果你有一个方阵,你可以这样做:

void printMatrix(int matrix[], int edge)
{
    int i,j;
    for (j=0; j<edge; ++j) {
        for (i=0; i<edge; ++i) {
            std:cout << matrix[j*edge + i] << " ";
        }
        std::cout << std::endl;
    }
}

本质上,将行(或列,由您决定)一个接一个地存储在 1D 数组中。请注意,内部循环遍历j - 这样循环将访问内存中的连续单元格。

然后,代码的其余部分应使用相同的约定。

但是,如果您为添加到

代码中的每个类、模板、设计模式等获得报酬(或获得积分),则这种方法并不是最好的。