在C ++中返回一个多维数组

时间:2014-12-07 19:57:14

标签: c++ arrays multidimensional-array

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)的值。然后将其输出到控制台。

然而我真正想要的是将它作为一个多维数组返回,但我不认为这可以做到吗?

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

3 个答案:

答案 0 :(得分:3)

当您想要返回非常规数据类型(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;
}

}
  

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

我建议你进一步研究指针,它们非常重要,你已经在不知情的情况下使用它们了。

答案 1 :(得分:3)

有多种选择。

选项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,但既然你提到你还不熟悉指针,我会保存模板类供以后使用。

答案 2 :(得分:0)

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

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;
}