向量 push_back() 和使用 [] 直接赋值给出不同的结果

Vector push_back() and direct assignment using [] give different results

我正在尝试解决这个 nQueens 问题,我的代码如下所示:

 class Solution {
public:
    vector<vector<string>> ans;
    
    bool canPlace(vector<string> &board, int row, int col, int n){
        //upper left diagonal
        int rowIndex = row;
        int colIndex = col;
        while(rowIndex >= 0 and colIndex >= 0){
            if(board[rowIndex][colIndex] == 'Q'){
                return false;
            }
            rowIndex--;
            colIndex--;
        }
        
        // left side
        rowIndex = row;
        colIndex = col;
        while(colIndex >= 0){
            if(board[rowIndex][colIndex] == 'Q'){
                return false;
            }
            colIndex--;
        }
        
        // left side
        rowIndex = row;
        colIndex = col;
        while(rowIndex < n and colIndex >= 0){
            if(board[rowIndex][colIndex] == 'Q'){
                return false;
            }
            rowIndex++;
            colIndex--;
        }
        
        return true;
    }
    
    void nQueens(vector<string> &board, int col, int n){
        if(col == n){
            ans.push_back(board);
            for(int i = 0; i < n; i++){
                cout<<board[i]<<", ";
            }
            cout<<endl;
            return;
        }
        
        for(int row = 0; row < n; row++){
            if(canPlace(board, row, col, n)){
                cout<<"Changing board from: "<<board[row][col]<<endl;
                board[row][col] = 'Q';
                nQueens(board, col+1,n);
                board[row][col] = '.';
            }
        }
    }
    
    vector<vector<string>> solveNQueens(int n) {
        vector<string> board(n);
        string s(n, '.');

        for(int i = 0; i < n; i++){
            board[i] = s;
            // push_back gives weird result
        }
        
        nQueens(board, 0, n);
        return ans;
    }
};

在最后一个solveNQueens函数中。在 for 循环中,如果我使用 board.push_back(s) 而不是 board[i] = s,leetcode 会抛出 Wrong Answer 错误,并且使用 cout 时的输出会显示奇怪的随机符号。 为什么是这样? push_back 不应该给出相同的结果吗?我很想知道为什么会这样。

这是 leetcode 问题的 link:https://leetcode.com/problems/n-queens

vector<string> board(n);

已经用 n 个元素填充向量。如果您现在添加额外的! push_back 的元素,你有一个包含两次元素的向量。前半部分已经从 std::vector 的构造函数中输入,后半部分稍后推入。

如果使用默认构造函数

vector<string> board;

结合 push_back,您将获得与示例代码相同的结果。

对于大型向量,预先初始化 n 元素并通过 operator[] 访问的解决方案可以更快,因为不需要在向量内部进行重新分配和复制操作。如果速度很重要:测量!

push_back 将一个新元素添加到向量的末尾,将其大小增加 1。
assignment 不会那样做;它 copies/moves 值(在你的情况下,在棋盘 vector 的那个位置 i)。

他们不一样