簡體   English   中英

如何通過引用將二維數組傳遞給 C++ 中的函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM