C ++ 2D Vector出错了

时间:2015-04-17 08:09:24

标签: c++ c++11 vector

#include <string>
#include <iostream>
#include <vector>
#include <iomanip>

using namespace std;

class matrix
{
 public:
    matrix(int);
    void func(int);
    vector<vector<double> > m;
};

matrix::matrix(int size)
{
    //set 3 X 3 = 9 elements to zero
    vector<vector<int> > m(size, vector<int>(size));

    // success
    cout << "test1 if m[0][0] equals to zero: " << m[0][0] << endl;
}

void matrix::func(int size)
{
    // failure, can't pass till here
    cout << "test2 if m[0][0] equals to zero: " << m[0][0] << endl;

    for(int i = 1; i != size; ++i)
    {
        m[i][i] = 0;
    }
}



int main()
{
    int input1 = 3;

    matrix mat(input1);

    mat.func(input1);
}

我想创建一个2D维度向量而不是使用数组。但是,我遇到了运行时错误。

我创建一个vector<vector<int> > m(size, vector<int>(size))以确保向量中的所有元素都等于零,并且我通过了test1。我无法通过我评论过“失败”的test2。

3 个答案:

答案 0 :(得分:6)

在构造函数中,您将创建一个局部变量m,并使用它。当然,它不适用于func功能。为了使其工作,您需要初始化对象的成员变量m。此外,您在构造函数中创建的向量类型错误(int而不是double

matrix::matrix(int size)
    : m(size, vector<double>(size)) //initializing the vector
{
}

答案 1 :(得分:4)

建议:如果您只是将内部存储为一个向量而不是向量向量,我无法帮助您认为它会更简单(并且可能内部更紧凑)。即。

std::vector<double> m;
size_t x;
size_t y;

这可能看起来不是二维的,但请记住,这是您班级的私人细节,而且是封装的目的。

认为你在这里遇到的问题是你在调整它们大小之前尝试顺从它们。创建矢量时,您必须为其指定初始大小,或者将值重新推送到它以增加大小。你可能想做前者你可以做的事情:

void matrix::resize( size_t x1, size_t y1 )
{
    m.clear();
    x = x1;
    y = y1;
    m.resize( x * y );
}

然后,您可以使用以下方式访问矩阵的单个元素:

double matrix::get( size_t x1, size_t y1 )
{
    return m[ x1 * x + y1 ];
}

答案 2 :(得分:1)

基本上,你在构造函数中做的是

vector<vector<int> > m(size, vector<int>(size));

m是一个局部变量。因此,它在构造函数外部不可用,因此在func()中,您基本上是尝试访问未初始化的向量。

要解决此问题,请通过将上述语句更改为:

来初始化构造函数中的m
m = vector<vector<int> >(size, vector<int>(size));