如何将项添加到二维动态矢量

时间:2013-11-01 14:33:05

标签: c++ stdvector

到目前为止,我已经能够使用1-d向量,通过推/弹回添加或删除元素。 然而,当试图填写一个应该代表矩阵的二维矢量时,我遇到了问题。我无法在我的2-d向量中使用这些功能。当代码编译并运行时,我得到要求维度的位,然后它要求第一个元素[1,1],对于输入的任何值,我得到“Segmentation fault:core dumped”。我不知道发生了什么,并且一直试图修改我的代码,但没有取得很大的成功,互联网在提供如何填写这些该死的东西的简单指南方面也毫无用处...... 非常感谢你!

这是我的代码

#include <iostream>
#include <vector>
using namespace std;

vector<vector<double> > readMatrix();

int main()
{
    vector<vector<double> > matrix1 = readMatrix();

    vector<vector<double> > matrix2 = readMatrix();

}

vector<vector<double> > readMatrix()
{
    cout << "Entering a matrix" << endl;
    cout << "Number of Lines : ";
    int numberOfLines;
    cin >> numberOfLines;
    cout << "Number of Columns :";
    int numberOfColumns;
    cin >> numberOfColumns;
    vector<vector<double> > matrix;
    int i(0);
    int j(0);

    while(i<=numberOfLines && j<=numberOfColumns)
    {
        cout << "[" << i+1 << "," << j+1 << "] =" ;
        int value;
        cin >> value;
        matrix[i].push_back(value);
        cout << endl ;
        j++;
        if(j==numberOfColumns)
        {
            j=1;
            i++;
        }
    }

    return matrix;
}

4 个答案:

答案 0 :(得分:0)

声明这样的矩阵:

vector<vector<double> > matrix (y, vector<double> (x, 0));

现在你有一个y * x矩阵。如果你想使用push_back,你必须在新行开始时声明x向量。

答案 1 :(得分:0)

当你执行vector<vector<double> > matrix;时,你初始化了一个大小为0的向量向量(这是默认值),所以即使在matrix[i].push_back(value) i==0时你也可以访问你没有的内存没有分配。如果你预先分配这样的内存会更好:

vector<vector<double> > matrix(numberOfLines,vector<double>(numberOfColumns)); 然后你不需要推回或任何东西,只需matrix[i][j]=whatever

答案 2 :(得分:0)

在C ++中,您可以使用向量构造函数自动定义大小:
vector<vector<double> > matrix(numberOfLines, vector<double>(numberOfColumns, 0));
对于向量,for循环比while循环更好,因为大小总是已知的。我建议你用这些迭代迭代向量行和列(并删除你的push_back语句。)

答案 3 :(得分:0)

你需要做类似的事情:

matrix.resize( ... );
.
.
.
matrix[i].push_back( ... );

这里的问题是你没有二维向量。你有一个矢量,矢量,双打。你需要在第一个向量中放置一些向量,如上所述调用resize()是一种方法。你也可以将一个初始大小传递给构造函数,你可以逐个推送向量 - 虽然这可能带来性能问题。