你如何在C ++中返回一个二维数组?

时间:2010-02-26 21:59:10

标签: c++

如何在C ++中返回二维数组?

例如,我在java中有以下方法:

public static int[][] getFreeCellList(int[][] grid) {
    // Determine the number of free cells
    int numberOfFreeCells = 0;
    for (int i=0; i<9; i++) 
      for (int j=0; j<9; j++)
        if (grid[i][j] == 0)
          numberOfFreeCells++;

    // Store free cell positions into freeCellList
    int[][] freeCellList = new int[numberOfFreeCells][2];
    int count = 0;
    for (int i=0; i<9; i++)
      for (int j=0; j<9; j++)
        if (grid[i][j] == 0) {
          freeCellList[count][0] = i;
          freeCellList[count++][1] = j;
        }
    return freeCellList;
  }

我正在尝试用C ++复制它。通常情况下,我会传入我想要返回的2d数组作为C ++中方法的参考参数。

但是,正如您在上面的方法中看到的那样,直到运行时才知道返回的数组的大小。

所以,在这种情况下,我猜我需要实际返回一个二维数组,对吧?

6 个答案:

答案 0 :(得分:5)

您也可以使用vector的{​​{1}}。

vector

答案 1 :(得分:1)

内部数组似乎固定为2的大小。因此可以使用array

的向量
static std::vector< array<int, 2> > getFreeCellList(int grid[][9]) {
    // Determine the number of free cells
    int numberOfFreeCells = 0;
    for (int i=0; i<9; i++) 
      for (int j=0; j<9; j++)
        if (grid[i][j] == 0)
          numberOfFreeCells++;

    // Store free cell positions into freeCellList
    std::vector< array<int, 2> > freeCellList(numberOfFreeCells);
    int count = 0;
    for (int i=0; i<9; i++)
      for (int j=0; j<9; j++)
        if (grid[i][j] == 0) {
          freeCellList[count][0] = i;
          freeCellList[count++][1] = j;
        }
    return freeCellList;
}

用法就像

int x[9][9] = { ... };
std::vector< array<int, 2> > pa = getFreeCellList(x);

由于您使用std::vector,因此无需手动内存管理。 array处于提升状态,但您可以快速手动编写类似的类

template<typename E, int N>
struct array {
  E &operator[](int I) { return data[I]; }
  E data[N];
};

数据成员是N类型E元素的数组。

或者,您可以使用低级二维数组来编写此代码。由于内部维度在您的代码中是固定的,您实际上可以分配一个真实的本机2d数组,而不是复杂的1d指针数组到单独的缓冲区:

static identity<int[2]>::type *getFreeCellList(int grid[][9]) {
    // Determine the number of free cells
    int numberOfFreeCells = 0;
    for (int i=0; i<9; i++) 
      for (int j=0; j<9; j++)
        if (grid[i][j] == 0)
          numberOfFreeCells++;

    // Store free cell positions into freeCellList
    int (*freeCellList)[2] = new int[numberOfFreeCells][2];
    int count = 0;
    for (int i=0; i<9; i++)
      for (int j=0; j<9; j++)
        if (grid[i][j] == 0) {
          freeCellList[count][0] = i;
          freeCellList[count++][1] = j;
        }
    return freeCellList;
}

现在您可以像

一样使用它
int x[9][9] = { ... };

// equivalent: identity<int[2]>::type *pa = ...;
int (*pa)[2] = getFreeCellList(x);
// ...
delete[] pa;

请注意使用identity(来自boost或见下文)来简化语法。否则你需要编写以下内容

static int (*getFreeCellList(int grid[][9]))[2] {
  // ...
}

// identity implementation (for working around the evil C++ syntax)
template<typename T>
struct identity { typedef T type; };

答案 2 :(得分:0)

您可以将其放在结构中,然后返回结构。否则C ++不允许返回数组。您还可以返回指向第一个元素(平面1D数组或完全动态2D数组)的指针。

答案 3 :(得分:0)

您无法返回任意大小的2d数组,就像您无法将任意大小的2d数组作为参数传递一样。

与Java数组相比,C ++数组可怕。别碰它们!请改用vector

答案 4 :(得分:0)

这样的结构
int[][] 
C和C ++中的

仅存在于静态数据中,例如

int[][] =
{
    {1, 2},
    {0, 1}
};

编译器可以在编译时确定元素的大小。如果您在编译时知道内部数组的大小 - 或者如果您可以修复它们,那么请使用typedef,例如:

typedef int[16] IntArr16;

然后你的函数可以返回这种类型的数组

IntArr16* getFreeCellList(...).

这一切都很简单C.其他可能性(如dirkgently所解释的)返回stl容器。

答案 5 :(得分:0)

它更像是C风格的解决方案,而不是C ++风格的解决方案,但您总是可以返回像

这样的结构
struct {
    int   dimension_one;
    int   dimension_two;
    void* pArray;
} return_type_t;

动态分配您的2D数组,存储两个数组维度和指向结构中已分配内存的指针,并将其传递回调用者。