0

到目前为止,我已经能够使用一维向量,通过推/弹回添加或删除元素。但是,当尝试填写应该表示矩阵的二维向量时,我遇到了问题。我无法将这些功能与我的二维向量一起使用。当代码编译并运行时,我得到要求维度的位,然后它要求第一个元素 [1,1],对于输入的任何值,我都会得到“分段错误:核心转储”。我不知道发生了什么,并且一直在尝试修改我的代码,但没有取得很大的成功,互联网在提供如何填写这些该死的东西的简单指南方面也相当无用......谢谢你很多!

这是我的代码

#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

4 回答 4

0

像这样声明矩阵:

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

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

于 2013-11-01T14:38:24.460 回答
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

于 2013-11-01T14:38:48.930 回答
0

您需要执行以下操作:

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

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

于 2013-11-01T14:40:48.747 回答
0

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

于 2013-11-01T14:39:51.693 回答