向量 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
)。
他们不一样
我正在尝试解决这个 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
)。
他们不一样