[英]C++ - passing static 2d array to functions
我應該如何將靜態2d數組傳遞給cpp中的參數? 我嘗試過這樣的事情:
void foo(int (&tab)[N][N]) {
// function body
}
int main() {
int n;
cin >> n;
int tab[n][n];
foo(tab); // doesn't work
return 0;
}
嘗試調用foo時,出現“無匹配函數錯誤”。
我需要靜態數組,因為矢量對於我的需求而言太慢了。 我也想避免聲明具有10000行和列的數組。 而且,我想使用函數,因為它將使我的代碼可讀。 有什么解決方案可以滿足我的期望嗎?
使用cin >> n;int tab[n][n];
,則聲明一個可變長度數組(即,其尺寸不是編譯時常數的數組)。 這里有兩個問題:首先,標准C ++不支持它們,其次,它們與您介紹的固定大小的數組參數不兼容。 但是,如果使用編譯時已知的大小聲明數組,則它將起作用:
#define N 10
void foo(int (&tab)[N][N]) {
cout << tab[1][1] << endl;
}
int main() {
int tab[N][N] = {};
tab[1][1]=15;
foo(tab);
return 0;
}
經典的C ++解決方案將涉及使用向量的向量。 如果不合適(因為您需要更快的速度或對內存的更多控制),則可以為正方形二維數組定義自己的類。
我在代碼中使用的一個想法是,使用底層的一維vector
實現該目標,並使用訪問器方法返回一個指針。
struct My_2D_Array
{
explicit My_2D_Array(size_t n):
m_size(n),
m_data(n * n)
{
}
int* operator[](size_t i)
{
return m_data.data() + i * m_size;
}
size_t m_size;
std::vector<int> m_data;
};
這不僅缺少所有的健全性檢查,而且使綁定檢查的訪問成為不可能(因為訪問器返回了裸指針),而且將作為一種快速而又骯臟的解決方案。
在代碼中的用法:
int foo(My_2D_Array& matrix)
{
// example
return matrix[2][3] + matrix[3][2];
}
int main()
{
int n;
cin >> n;
My_2D_Array tab(n);
foo(tab);
return 0;
}
這個想法是高度可定制的-您可以根據需要使My_2D_Array
的代碼簡單或聰明。 例如,如果您仍然不喜歡使用vector
,即使它是一維的,您也可以單獨管理(分配/取消分配)內存,並將int*
而不是vector<int>
在My_2D_Array
。
只使用一個vector<>
的vector<int>
。 無需混用非標准陣列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.