#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。
答案 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));