为什么 += 在向量中插入字符串<string>然后推入 2d 字符串向量时有效,但在逐个字符插入字符时不起作用?



我正在创建一个大小为4x4的字符串向量,所有字符作为点,即我正在创建:

....
....
....
....

然后我必须将这个字符串向量压入字符串向量的向量中,就像下面的代码一样

int main()
{
vector<vector<string>> ans;
int n=4;
vector<string> matrix(n);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
matrix[i][j]='.';    //inserting '.' as characters
}
}

ans.push_back(matrix);

for(int i=0;i<n;i++)   //printing the just inserted matrix
{
for(int j=0;j<n;j++)
{
cout<<ans[0][i][j]<<" ";
}
cout<<endl;
}

}

这是当我把它打印回来的时候,它给出了垃圾/什么都没有。但是,我将插入matrix[i][j]='.';改为matrix[i]+='.';,它工作得很好。

int main()
{
vector<vector<string>> ans;
int n=4;
vector<string> matrix(n);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
matrix[i]+='.';    //inserting '.' by +=
}
}

ans.push_back(matrix);

for(int i=0;i<n;i++)   //printing the just inserted matrix
{
for(int j=0;j<n;j++)
{
cout<<ans[0][i][j]<<" ";   //works fine
}
cout<<endl;
}

}

这种行为的原因是什么?

我不明白为什么这不会直接崩溃:

vector<string> matrix(n);  // THIS IS A VECTOR OF EMPTY STRINGS
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
matrix[i][j]='.';    //inserting '.' as characters
}
}

当你引用matrix[i]时,你得到一个空字符串,因为你没有给这个字符串分配任何东西。试图访问该字符串中的任何元素并为其赋值char将会抛出异常为未定义行为。

有一个简单的修复方法:

for(int i=0;i<n;i++)
{
matrix[i] = string(n ,' ');
for(int j=0;j<n;j++)
{
matrix[i][j]='.';    //inserting '.' as characters
}
}

或简单的:

for(int i=0;i<n;i++)
{
matrix[i] = string(n ,'.');
}

代码:

int n=4;
vector<string> matrix(n);

将创建一个充满n默认构造字符串的向量;即一个有4个空字符串的向量。因此,在下面的循环中,您使用超出边界的索引访问每个字符串(即未定义行为):

for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
matrix[i][j] = '.';
// ^ Out of bounds: matrix[i].size() == 0
}
}

第二种情况:

for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
matrix[i] += '.';
// ^ You're appending '.' to the string.
//   That's fine
}
}

你要添加到字符串上,这很好。

如果你想有一个包含n字符串的向量,每个字符串包含n乘以字符'.',你可以跳过循环并执行:

int n = 4;
std::vector<std::string> matrix(n, std::string(n, '.'));

作为旁注,你没有显示它,但很可能你是:

using namespace std;

你不应该这么做。