我必须使用运算符重载来创建此类以添加两个矩阵。我不想在这个问题中使用指针,因为我还没有完全理解它们,我只是在尝试学习运算符重载。它显示的错误是分段错误(核心已转储)。
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
class Matrix {
public :
vector<vector<int> >a;
Matrix(){}
Matrix operator+( Matrix m ){
Matrix sum;
for (int i=0; i<a.size(); i++ ){
for(int j=0;j<a[i].size(); j++){
sum.a[i][j] = a[i][j] + m.a[i][j];
}
}
return sum;
}
};
int main () {
int cases,k;
cin >> cases;
for(k=0;k<cases;k++) {
Matrix x;
Matrix y;
Matrix result;
int n,m,i,j;
cin >> n >> m;
for(i=0;i<n;i++) {
vector<int> b;
int num;
for(j=0;j<m;j++) {
cin >> num;
b.push_back(num);
}
x.a.push_back(b);
}
for(i=0;i<n;i++) {
vector<int> b;
int num;
for(j=0;j<m;j++) {
cin >> num;
b.push_back(num);
}
y.a.push_back(b);
}
result = x+y;
for(i=0;i<n;i++) {
for(j=0;j<m;j++) {
cout << result.a[i][j] << " ";
}
cout << endl;
}
}
return 0;
}
矩阵sum
中的向量大小为零。因此,使用operator[]
会导致未定义的行为。
Matrix sum; // sum.a.size() is zero
for (int i=0; i<a.size(); i++ ){
for(int j=0;j<a[i].size(); j++){
sum.a[i][j] = a[i][j] + m.a[i][j]; // broken
} // sum.a[0][0] does not exist
}
有两种解决方案。最简单的方法是调整数组大小,使其具有所需的行数/列数
您没有初始化此行定义的矩阵的向量:
Matrix sum;
您的整个方法可能需要重新考虑。让调用者负责管理矩阵的内部表示会破坏封装的原理。
此外,对于非稀疏矩阵表示,使用vector<vector<int>>
效率不高。您最好使用一块连续的内存。
无论哪种方式,我都建议为Matrix
定义一个接受大小的构造函数。将内部数据设为私有并定义operator[]
或类似名称以访问数据