2011-10-10 54 views
1

我有2個二維數組表示迷宮C++:功能來處理不同大小的數組

const char maze1[10][11]const char maze2[20][21]

我試圖創建1個函數來處理兩個迷宮像這樣:

void solveMaze(maze[][]) 
{ 
} 

和只傳遞等solveMaze(maze1);
迷宮然而,我必須爲陣列,這是differen提供一個大小t取決於傳入哪個迷宮。如果不重載函數或使用函數模板,我怎樣纔能有1個函數來處理這兩個數組?

+1

如果你正在編寫C++,有什麼特別的原因你不使用STL容器? – Cascabel

+0

不熟悉STL,我仍然是初學者 – dukevin

+1

另外,這些** 2D **數組不是? – Zeenobit

回答

7

c + +回答

使用std::vector

// Initialize the vector with 11 rows of 10 characters 
std::vector<std::vector<char> > maze(11, std::vector<char>(10)); 

void solveMaze(const std::vector<std::vector<char> > &maze) { 
    // note that you can access an element as maze[x][y] 
} 

boost::multi_array會更有效(如果你允許使用升壓)。我認爲它是這樣的:

boost::multi_array<char, 2> maze(boost::extents[10][11]); 

void solveMaze(const boost::multi_array<char, 2> &maze) { 
    // note that you can access an element as maze[x][y] 
} 

Ç答案

使用指針:

const char maze1[10][11]; 

void solveMaze(char *maze, size_t x_length, size_t y_length) { 
    // note that you can access an element as maze[x + (x_length * y)] 
} 
+1

你的C例子是錯的。 C中的二維數組不是一個指針數組。 – Dave

+0

@Dave - 對,對不起。我不夠C。現在已經修復了。 –

+0

對於C++版本,您可能應該將參考或const引用傳遞給std :: vector。否則,將會有一個不必要的(也許是不正確的)容器的副本。 – andand

1

標準C++不允許可變大小的數組。 Gnu擴展允許這樣做。

給予了GNU編譯器,你可以

void solvemaze(int w, int h, const char maze[h][w]) 
{ //solve it... 
} 

否則,

void solvemaze(int w, int h, const char *maze) 
{ //solve it, bearing in mind: 
     //maze[y][x] = maze[(w*y)+x]; 
} 
+0

gnu編譯器的答案看起來非常好。如果只有我有gnu :( – dukevin

1

其實可以不向量解決:

template<size_t N, size_t M> 
void foo(char (&maze)[N][M]) 
{ 
    // do your stuff here 
} 

在另一方面,我也更喜歡使用矢量:它只是感覺更安全。

相關問題