[英]Why += works when inserting string in vector<string> and then pushing in 2d string vector, but doesn't work when inserting char by char?
我正在創建一個大小為 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]
時,您會返回一個空字符串,因為您沒有為該字符串分配任何內容。 嘗試訪問該字符串中的任何元素並為其分配一個字符將引發異常,這是未定義的行為。
有一個簡單的解決方法:
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;
你不應該這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.