在 C++ 中返回多维数组

Returning a multidimensional array in C++

本文关键字:数组 返回 C++      更新时间:2023-10-16
void createArray(int a, int b, int c, int d, int array[3][3]){
    int state[3][3];
    for(int x=0;x<3;x++){
        for(int y=0;y<3;y++){
            if(x == a && y == b){
                state[x][y] = array[c][d];
            }
            else if(x == c && y == d){
                state[x][y] = array[a][b];
            }
            else{
                state[x][y] = array[x][y];
            }
        }
    }
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            cout << state[i][j] << " ";
        }
        cout << endl;
    }
}

我基本上得到了这个函数,它克隆输入的多维数组,但交换两个坐标 (a,b) 和 (c,d) 的值。然后将其输出到控制台。

但是,我真正想要的是将其作为多维数组返回,但我认为这无法做到?

我已经查看了向量和指针,但并不真正理解它们,如果我使用它们,我将不得不更改我之前编写的所有代码。

有多个选项。

选项 1 - 将数组传递给函数

void createArray(int a, int b, int c, int d, const int array[3][3], int outArray[3][3]){
...
}

选项 2 - 返回对数组的引用 - 只需确保数组不在返回它的函数堆栈上。

typedef int My3Times3Array[3][3];
const My3Times3Array& createArray(int a, int b, int c, int d, const int array[3][3]){
...
}

选项 3 - 返回一个包含数组的类

struct Array
{
    int array[3][3];    
};
...
Array createArray(int a, int b, int c, int d, const int array[3][3]){
...
}

还有std::vectorstd::arrayboost::matrix,但由于您提到您对指针还不满意,我将保存模板类以备后用。

当你想返回一个非常规的数据类型(intchar等)时,最好的方法是创建你自己的数据类型。

struct mat3
{
    int myArray[3][3];    
};

mat3 createArray(int a, int b, int c, int d, int array[3][3]){
mat3 state;
for(int x=0;x<3;x++){
    for(int y=0;y<3;y++){
        if(x == a && y == b){
            state.myArray[x][y] = array[c][d];
        }
        else if(x == c && y == d){
            state.myArray[x][y] = array[a][b];
        }
        else{
            state.myArray[x][y] = array[x][y];
        }
    }
}
for(int i=0;i<3;i++){
    for(int j=0;j<3;j++){
        cout << state.myArray[i][j] << " ";
    }
    cout << endl;
    return state;
}
}

我已经查看了向量和指针,但并不真正理解它们,如果我使用它们,我将不得不更改我以前编写的所有代码

我建议你进一步研究指针,它们是如此重要,以至于你已经在不知情的情况下使用它们。

您可以动态分配二维数组并返回指向它的指针。例如

typedef int ( *STATE )[3];
STATE createArray(int a, int b, int c, int d, int array[3][3]){
    STATE state = new int[3][3];
    //...
    return state;
}

int ( *createArray(int a, int b, int c, int d, int array[3][3] ) )[3]{
    int ( * state )[3] = new int[3][3];
    //...
    return state;
}

事实上,如果你使用向量,你可以得到相同的结果。例如

#include <vector>
#include <array>
//...
std::vector<std::array<int, 3>> createArray(int a, int b, int c, int d, int array[3][3]){
    std::vector<std::array<int, 3>> state( 3 );
    //...
    return state;
}