我有 3 个二维数组,我想传递给一个函数。目前,我使用 if-else 语句来决定要发送哪个数组,然后复制所选数组的内容并传递新数组。
新数组:
char board[100][100]={}
这些是数组(内容未显示):
char mazeEasy[19][38], mazeMed[41][81], mazeHard[72][98];
如何在不使用的情况下将这三个函数中的任何一个传递给一个函数board[100][100]
?
一种可能性是一个template
函数:
template <typename T, std::size_t Dim1, std::size_t Dim2>
void f(T(&)[Dim1][Dim2])
{
std::cout << Dim1 << ", " << Dim2 << "\n";
}
请参阅http://ideone.com/b60h1e上的演示。请注意,这将实例化函数模板的三个不同实例(每个不同维度组合的实例化)。
建议改为a std::vector<std::vector<char>>
。这避免了多个实例化,并且函数可以查询std::vector
其大小或迭代:
void f(std::vector<std::vector<char>>& a_maze)
{
std::cout << a_maze.size() << ", " << a_maze[0].size() << "\n";
}
不是同一个函数,但你可以通过使用模板和相对未知的“如果你想要显式维度,通过引用传递数组”方法来获得每对维度的函数:
template<size_t i, size_t j>
void stuff(char (&arr)[i][j])
{
for (size_t x = 0; x < i; x++)
{
for (size_t y = 0; y < j; y++)
{
std::cout << arr[x][y] << " ";
}
std::cout << std::endl;
}
}
/从评论中移出/
如果我错了,请纠正我,但我相信 C 中 2D 数组的内存布局是标准的一部分,你不能期待任何东西
An object of array type contains a contiguously allocated non-empty
set of N sub-objects of type T.
同样适用于 2D。
所以我会提出简化的 C 风格的解决方案。现代 C++ 编译器的生命还没有结束,有时您需要针对轻量级嵌入式系统和编译器的类似解决方案。
void dumpArray( int * array, int w, int h)
{
for (int i=0;i<h;i++)
for (int j=0;j<w;j++)
{
printf("[%i,%i] = %i\n", i,j,array[i*w+j]);
}
}
int main(int argc, char * argv[])
{
int a[2][3] = { {1,2,3}, {4,5,6} };
int a1[3][3] = { {1,2,3}, {4,5,6}, {7,8,9} };
dumpArray( (int*)a, 3, 2);
dumpArray( (int*)a1, 3, 3);
return 0;
}