我制作了一个类型为T的矩阵类MxN并尝试实例化并打印它。
您在代码末尾看到的问题出现了(当我cout << m;
时)
该命令打印出一个矩阵,其中包含另一个矩阵的某些字段 - 实际上m
的第一列与m2
的最后一列相同,我不明白为什么?
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <stdexcept>
using namespace std;
template<typename T, int M>
class matrix_helper {
public:
T& operator[](int j) {
return data[j];
}
private:
T data[M];
};
template<typename T, int N, int M>
class matrix {
public:
explicit matrix(const vector<T>& v) {
if (v.size() != M * N)
throw invalid_argument("Incorrect input data");
int i=0, j=0;
for (int k = 0; k != M*N; ++k) {
data[i][j] = v[k];
++i;
if (i == M) { // i:0..M
i = 0;
++j;
}
}
}
matrix_helper<T,M> operator[](int j) {
matrix_helper<T, M> mh;
for(int i=0; i != M; ++i) {
mh[i] = data[j][i];
}
return mh;
}
matrix<T,M,N>& operator+=(matrix<T,M,N>& m) {
for(int i=0; i != N;++i)
for(int j=0; j != M;++j) {
this->data[i][j] += m[i][j]; // or - should I rather use (*this)[i][j] += ... ???
}
return *this;
}
private:
T data[N][M];
};
template<typename T, int N, int M>
ostream& operator<<(ostream& os, matrix<T,N,M> & m) {
int i=0, j=0;
for (int k = 0; k != M*N; ++k) {
os << m[i][j] << '\t';
++i;
if (i == M) { // i:0..M
i = 0;
++j;
os << endl;
}
}
os << endl;
}
int rnd(int max = 20) { return rand() % max; }
void print(int i) { cout << i << ' '; }
int main() {
vector<int> u, v;
for (int i = 0; i != 20; ++i) u.push_back(i);
for (int i = 20; i != 40; ++i) v.push_back(i);
//for_each(u.begin(), u.end(), print);
matrix<int, 4,5> m(u);
matrix<int, 4,5> m2(v);
cout << m; // returns: 24 1 2 3 4,... Why not 0 1 2 3 4 ???
cout << endl;
system("pause");
return 0;
}
答案 0 :(得分:4)
您声明了一个[N][M]
数组,但您的初始化代码将其视为[M][N]
。
答案 1 :(得分:1)
你在m中看到m2的值的事实是因为你的矩阵ctor在数据数组边界之外写入覆盖堆栈附近的任何东西。正是这一行:
data[i][j] = v[k];
在数组边界之外写入。
也是你的
ostream& operator<< ()
应该返回值
答案 2 :(得分:-1)
您需要为matrix :: data array分配内存。
你可以这样修改,
T data[N][M];
=&gt; std::vector< std::vector<T> > data;
然后在构造函数中准备好向量,
data.assign(M, std::vector<T>());
for (int x=0; x<M; ++x)
data[x].assign(N, T());