如何在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 ++中方法的参考参数。
但是,正如您在上面的方法中看到的那样,直到运行时才知道返回的数组的大小。
所以,在这种情况下,我猜我需要实际返回一个二维数组,对吧?
答案 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数组,存储两个数组维度和指向结构中已分配内存的指针,并将其传递回调用者。