簡體   English   中英

為什么 += 在向量中插入字符串時有效<string>然后推入二維字符串向量,但在按字符插入字符時不起作用?

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

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