C ++将不同大小的不同数组传递给相同的函数

时间:2013-04-23 10:37:16

标签: c++ arrays

我想要传递给一个函数的3个2D数组。目前,我使用if-else语句来决定发送哪个数组,然后复制所选数组的内容并传递新数组。

新阵列:

char board[100][100]={}

这些是数组(内容未显示):

char mazeEasy[19][38], mazeMed[41][81], mazeHard[72][98];

如何在不使用board[100][100]的情况下将这三个中的任何一个传递给一个函数?

3 个答案:

答案 0 :(得分:7)

可能是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的演示。请注意,这将实例化函数模板的三个不同实例(每个不同维度组合的一个实例)。

建议改为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";
}

请参阅http://ideone.com/nHL8Hj上的演示。

答案 1 :(得分:3)

不是相同的函数,但是你可以通过使用模板和相对未知的“通过引用传递数组,如果你想要显式维度”方法获得每对维度的函数:

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

答案 2 :(得分:1)

/从评论/

移动

如果我错了,请纠正我,但我相信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; 
}