[英]How to pass a 2D array by Reference to a function in C++
如何在函數 dfs 中傳遞數組 b1,b1 是一個二維整數數組,用於跟蹤節點是否被訪問。 抱歉代碼可讀性差。 我想通過引用傳遞它,因為它需要被遞歸調用的函數修改。目前出現此錯誤。
Line 33: Char 94: error: 'b1' declared as array of references of type 'int &'
void dfs(int i,int j,vector<vector<char>>& board,string word,int k,bool& yellow,int& b1[][]){
^
1 error generated.
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
int m = board.size();
int n = board[0].size();
int b1[m][n];
list<pair<int,int>> mp;
bool yellow=false;
for(int i=0;i<board.size();i++){
for(int j=0;j<board[0].size();j++){
if(board[i][j]==word[0]){
mp.push_front({i,j});
}
}
}
for(auto itr=mp.begin();itr!=mp.end();itr++){
int i=itr->first;
int j=itr->second;
dfs(i,j,board,word,0,yellow,b1);
if(yellow==true){
return yellow;
}
memset(b1,0,sizeof(b1));
}
return yellow;
}
void dfs(int i,int j,vector<vector<char>>& board,string word,int k,bool& yellow,int& b1[][]){
int m = board.size()-1;
int n = board[0].size()-1;
b1[i][j]=1;
if(k==word.size()-1){
yellow=true;
}
if(i+1<=m && board[i+1][j]==word[k+1] &&b1[i+1][j]==0){
dfs(i+1,j,board,word,k+1,yellow,b1);
}
if(i-1>=0 && board[i-1][j]==word[k+1] &&b1[i-1][j]==0){
dfs(i-1,j,board,word,k+1,yellow,b1);
}
if(j+1<=n && board[i][j+1]==word[k+1]&& b1[i][j+1]==0){
dfs(i,j+1,board,word,k+1,yellow,b1);
}
if(j-1>=0 && board[i][j-1]==word[k+1] && b1[i][j-1]==0){
dfs(i,j-1,board,word,k+1,yellow,b1);
}
}
};
由於您已經使用vector<vector<char>>& board
作為一個參數,因此修復此錯誤的最簡單方法是使用vector<vector<int>> b1
而不是int b1[m][n]
。
請注意像int a[n][m]
這樣的 VLA,它不容易維護,也不推薦。 請參閱為什么可變長度數組不是 C++ 標准的一部分? .
這是我用2D vector
替換b1
的示例。
class Solution {
public:
bool exist(vector<vector<char>> &board, string word) {
int m = board.size();
int n = board[0].size();
// int b1[m][n];
vector<vector<int>> b1(m, vector<int>(n, 0));
list<pair<int, int>> mp;
bool yellow = false;
for (int i = 0; i < board.size(); i++) {
for (int j = 0; j < board[0].size(); j++) {
if (board[i][j] == word[0]) {
mp.push_front({i, j});
}
}
}
for (auto itr = mp.begin(); itr != mp.end(); itr++) {
int i = itr->first;
int j = itr->second;
dfs(i, j, board, word, 0, yellow, b1);
if (yellow == true) {
return yellow;
}
// memset(b1, 0, sizeof(b1));
for (auto &row: b1) {
std::fill(row.begin(), row.end(), 0);
}
}
return yellow;
}
// void dfs(int i,int j,vector<vector<char>>& board,string word,int k,bool& yellow,int& b1[][]){
void dfs(int i, int j, vector<vector<char>> &board, string word, int k, bool &yellow, vector<vector<int>> &b1) {
int m = board.size() - 1;
int n = board[0].size() - 1;
b1[i][j] = 1;
if (k == word.size() - 1) {
yellow = true;
}
if (i + 1 <= m && board[i + 1][j] == word[k + 1] && b1[i + 1][j] == 0) {
dfs(i + 1, j, board, word, k + 1, yellow, b1);
}
if (i - 1 >= 0 && board[i - 1][j] == word[k + 1] && b1[i - 1][j] == 0) {
dfs(i - 1, j, board, word, k + 1, yellow, b1);
}
if (j + 1 <= n && board[i][j + 1] == word[k + 1] && b1[i][j + 1] == 0) {
dfs(i, j + 1, board, word, k + 1, yellow, b1);
}
if (j - 1 >= 0 && board[i][j - 1] == word[k + 1] && b1[i][j - 1] == 0) {
dfs(i, j - 1, board, word, k + 1, yellow, b1);
}
}
};
您是否正在從 GNU 轉向更嚴格的 C++ 編譯器?
GNU 歷史上允許傳遞具有運行時可變維度的二維數組。 不記得確切的語法,您可能需要將 M,N 聲明為參數,以便編譯器知道尺寸來自哪里。
這是一個古老的 FORTRAN 技巧,有很多要求 C++ 也應該擁有它,所以 GNU 自己完成了它(他們也有 FORTRAN 編譯器,所以這也是互操作性的問題)。 C99 標准也更改為允許它 => C++ 現在是一只孤獨的跛鴨。
如果您實際上在 GNU 上,請研究一下如何聲明它,但請記住,它不會構建在其他 C++ 風格上。
哦,您不需要對 int 的引用數組。 數組始終是(隱式/隱藏)指針(又名引用)。 整個引用狂熱來自歷史上被“特權”作為指針訪問的數組,而無需 *. 請記住,引用是自解引用指針=>您剛剛聲明了一個指針數組-隱藏:-)
當普通引用與它們的用法在同一范圍內聲明時,編譯器知道如何優化隱藏指針方面,但如果你跨越函數調用邊界,它們必須作為指針。 如果將它們隱藏在數組中,編譯器必須放棄 - 但它完全有權尖叫,因為引用數組是概念上的廢話,你不會初始化它們=>如果編譯器允許它們,它們都將是空炸彈。
注意:在 C++20 中,您可以“重新分配”引用,但不能顯式地 - 僅作為較大對象的 self-mut(il)ation 的一部分(不要在家嘗試:-)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.