繁体   English   中英

为什么不能通过推回将值存储在2D向量中?

[英]why can't I store values in my 2D vector by push back?

我陷入了很多问题,试图在2D向量中存储值。 所以我写了这个简单的代码。

我只是存储和打印我的价值观:

int main()
{
    vector<vector<int>> vec;
    vector<int> row{1,3,5,7,9,12,34,56};
    int i,n,m,rs,vs;
    rs=row.size();
    cout<<"rs = "<<rs<<endl;
    for(i=0;i<(rs/2);i++)
    {
        vec[i].push_back(row.at(i));
        vec[i].push_back(row.at(i+4));
    }
    vs=vec.size();
    cout<<vs<<endl;
    for(n=0;n<vs;n++)
    {
        for(m=0;m<2;m++)
        {
            cout<<vec[n][m]<<" ";

        }
        cout<<endl;
    }
    return 0;

}

首先,您应该阅读为什么“使用命名空间标准”被认为是不好的做法?

在使用变量时而不是在程序开始时声明变量。

向量vec开头是空的。 在循环

for(i=0;i<(rs/2);i++)
{
    vec[i].push_back(row.at(i));
    vec[i].push_back(row.at(i+4));
}

您正在使用vec的第i个元素进行引用

vec[i]

但是此元素不存在。 这是未定义的行为,可能会导致分段错误。 您可以通过使用所需元素构建向量来修复它

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> row{1,3,5,7,9,12,34,56};
    int rs = row.size();
    std::vector<std::vector<int>> vec(rs / 2);
    std::cout << "rs = " << rs << '\n';
    for(int i = 0; i < rs / 2; ++i)
    {
        vec[i].push_back(row.at(i));
        vec[i].push_back(row.at(i + 4));
    }
    int vs = vec.size();
    std::cout << vs << '\n';
    for(int n = 0; n < vs; ++n)
    {
        for(int m = 0; m < 2; ++m)
        {
            std::cout << vec[n][m] << " ";
        }
        std::cout << '\n';
    }
    return 0;
}

在这个例子中

std::vector<std::vector<int>> vec(rs / 2);

构造一个包含rs / 2默认构造元素的向量。 或者,您可以从空向量开始,然后在循环中推回元素

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> row{1,3,5,7,9,12,34,56};
    int rs=row.size();
    std::vector<std::vector<int>> vec;
    std::cout << "rs = " << rs << '\n';
    for(int i = 0; i < rs / 2; ++i)
    {
        vec.push_back({row.at(i), row.at(i+4)});
        //
        // is similar to:
        // vec.push_back({});
        // vec.back().push_back(row.at(i));
        // vec.back().push_back(row.at(i+4));
        //
        // is similar to:
        // vec.push_back({});
        // vec[i].push_back(row.at(i));
        // vec[i].push_back(row.at(i+4));
    }
    int vs = vec.size();
    std::cout << vs << '\n';
    for(int n = 0; n < vs; ++n)
    {
        for(int m = 0; m < 2; ++m)
        {
            std::cout << vec[n][m] << " ";
        }
        std::cout << '\n';
    }
    return 0;
}

我建议第一个解决方案。 最好为所有元素分配内存并使用它,而不是在每个循环迭代中分配内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM