【问题标题】:Push back data into a 2D vector将数据推回二维向量
【发布时间】:2018-11-07 05:14:45
【问题描述】:

我正在尝试创建一个设置大小的二维向量,然后将数据插入其中。我遇到的问题是能够插入填充二维向量中每一列和每一行的数据。

我已经阅读了各种其他线程,但找不到适合我的实现。

这是我的问题的一些示例代码:

int main()
{
    vector<string> strVec = { "a","b","c","d" }; 
    // letters to insert into vector                                        
    // this is just a sample case

    vector< vector<string>> vec;        // 2d vector
    int cols = 2;                       // number of columns 
    int rows = 2;                       // number of rows


    for (int j = 0; j < cols; j++)      // inner vec
    {
        vector<string>temp;             // create a temporary vec
        for (int o = 0; o < rows; o++)  // outer vec
        {
            temp.push_back("x");        // insert temporary value
        }
        vec.push_back(temp);            // push back temp vec into 2d vec
    }

    // change each value in the 2d vector to one
    // in the vector of strings
    // (this doesn't work) 
    // it only changes the values to the last value of the 
    // vector of strings
    for (auto &v : strVec)  
    {
        for (int i = 0; i < vec.size(); i++)
        {
            for (int j = 0; j < vec[i].size(); j++)
            {
                vec[i][j] = v;
            }
        }
    }

    // print 2d vec
    for (int i = 0; i < vec.size(); i++)
    {
        for (int j = 0; j < vec[i].size(); j++)
        {
            cout << vec[i][j];
        }
        cout << endl;
    }
}

【问题讨论】:

  • 要将vec 预设为2 行2 列,请将vector&lt; vector&lt;string&gt;&gt; vec; 更改为vector&lt; vector&lt;string&gt;&gt; vec(2, vector&lt;string&gt;(2));。现在您可以使用vec[i][j] 而无需退回。 That said, here's a better alternative。因为只有一个vector,所以所有数据都紧密地打包在一起,极大地提高了缓存的友好性和分配存储所花费的时间。

标签: c++ vector 2d push-back


【解决方案1】:

您在循环for (auto &amp;v : strVec) 中一次又一次地为vec 的所有元素分配相同的字符串。 即vec[0][0]=vec[0][1]=vec[1][0]=vec[1][1]=avec[0][0]=vec[0][1]=vec[1][0]=vec[1][1]=b等。

去掉这个外层循环并将strVec[i*cols+j]分配给vec[i][j],我们可以得到想要的输出。

DEMO is here.

for (int i = 0; i < vec.size(); i++)
{
    for (int j = 0; j < vec[i].size(); j++)
    {
        vec[i][j] = strVec[i*cols+j];
    }
}

【讨论】:

  • 哇,我觉得自己像个白痴,竟然这么简单。改用矩阵有什么好处?
  • @Nezz609 重点不是 lambda(因此我删除了 lambda 表达式,抱歉,这很混乱),而是将二维矩阵的数据存储在一维数组中。好处是缓存友好。
  • 好吧,有机会我会多读。感谢您的帮助!
【解决方案2】:
for (int i = 0; i < vec.size(); i++)
{
    for (int j = 0; j < 2; j++)
    {
        cout << vec[i][j];
    }
    cout << endl;
}

【讨论】:

  • 欢迎来到 Stack Overflow。在这里回答问题很好,但这只是一段代码,几乎与问题中的部分代码相同。问题是关于将数据放入数组中,而不是像这里的代码那样打印它。一个好的答案解释了代码如何回答原始问题。
猜你喜欢
  • 2021-08-16
  • 2014-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 2021-01-31
相关资源
最近更新 更多