用C ++初始化2D向量

时间:2016-04-22 06:21:53

标签: c++ vector

我想通过2D矢量从用户那里获取2D矩阵的输入。但是当我在下面做的时候,程序崩溃了!!!但为什么呢?

int m, n;
cin>>m>>n;

vector<vector<int> > v;

for(int i=0; i<m; i++)
{
     for(int j=0; j<n; j++)
     {
         int a;
         cin>>a;
         v[i].push_back(a);
     }
}

根据我的代码,解决方案是什么。

3 个答案:

答案 0 :(得分:5)

v[i].push_back(a);循环内调用for时,向量v为空,使用v[i]会导致未定义的行为。

您的代码应首先push_back一个vector<int>

for (int i=0; i<m; i++)
{
    v.push_back(vector<int>());
    for (int j=0; j<n; j++)
    {
        int a;
        cin >> a;
        v[i].push_back(a);
    }
}

另一种方法是将vector v显式初始化为m

int m, n;
cin>>m>>n;
vector<vector<int> > v(m);

for(int i=0; i<m; i++)
{
     for(int j=0; j<n; j++)
     {
         int a;
         cin>>a;
         v[i].push_back(a);
     }
}

答案 1 :(得分:4)

由于你知道矩阵的大小,只需在填充之前调整v:

public void exportSubjectData(File outputFile, String subNum) throws IOException, SQLException {

    csvWrite = new CSVWriter(new FileWriter(outputFile));

    curCSV = db.rawQuery("SELECT * FROM " + DATA_TABLE_NAME + " WHERE id = " + subNum, null);

    csvWrite.writeNext(curCSV.getColumnNames());

    while (curCSV.moveToNext()) {

        String arrStr[] = {curCSV.getString(0), curCSV.getString(1), curCSV.getString(2),
                curCSV.getString(3), curCSV.getString(4), curCSV.getString(5),
                curCSV.getString(6), curCSV.getString(7), curCSV.getString(8),
                curCSV.getString(9), curCSV.getString(10)};

        csvWrite.writeNext(arrStr);
    }

    csvWrite.close();
    curCSV.close();
}

答案 2 :(得分:-1)

当你调用v [i] .push_back()时,

v [i]还没有被构造,你只需要首先初始化。这很简单:

vector<vector<int>> v;
v.reserve(m);
for(...)
...