Я пытаюсь создать шаблонный класс Matrix в C ++.Ниже приведена его реализация.Я реализовал два оператора +, + = на данный момент, просто чтобы дать представление о том, как это будет выглядеть, и я подумал, что было бы лучше запросить обратную связь, прежде чем я продолжу.
Вся реализация является публичной итакже нет явных проверок границ и ошибок, это потому, что она не предназначена для полноценной матричной библиотеки и, следовательно, избегает ненужного кода.
Было бы очень полезно, если бы кто-то мог прокомментировать это и мог бы предложитьнесколько улучшений или предложений.
Спасибо.
template<class T>
class Matrix
{
public:
int r,c;
vector< vector< T > >mat;
Matrix() {}
// Constructor to set the size of the matrix
Matrix(int _r,int _c)
{
r=_r;c=_c;
mat.resize(r);
for(int i=0;i<r;i++)
mat[i].resize(c);
}
// Constructor to build a matrix from a C 2d array
// Pointer to the first element is passed (&arr[0][0])
Matrix(T *arr,int _r,int _c)
{
r=_r;c=_c;
mat.resize(r);
for(int i=0;i<r;i++)
for(int j=0;j<c;j++)
mat[i].push_back(arr[i*c+j]);
}
template<typename U>
Matrix<T>& operator +=(const Matrix<U>&M)
{
for(int i=0;i<r;i++)
for(int j=0;j<c;j++)
mat[i][j]+=static_cast<T>(M.mat[i][j]);
return *this;
}
template<typename U>
Matrix<T> operator +(const Matrix<U>&M)
{
Matrix<T>tmp=*this;
return tmp+=M;
}
};
template<typename T>
istream& operator >>(istream &in,Matrix<T>&M)
{
in>>M.r>>M.c;
Matrix<T>tmp(M.r,M.c);
for(int i=0;i<M.r;i++)
for(int j=0;j<M.c;j++)
in>>tmp.mat[i][j];
M=tmp;
return in;
}
template<typename T>
ostream& operator <<(ostream &out,Matrix<T>M)
{
for(int i=0;i<M.r;i++)
{
for(int j=0;j<M.c;j++)
cout<<M.mat[i][j]<<" ";
cout<<endl;
}
return out;
}
РЕДАКТИРОВАТЬ: Спасибо всем за предложения.
У меня только один маленький вопрос, скажем, я хочу реализовать проверку ошибок (например: проверка границ, допустимых аргументов и т. Д.), Однако я хочу, чтобы пользователь предоставил возможность полностью отключить проверку ошибок,Есть ли хороший способ реализовать это?Что мне нужно, это что-то вроде примера: `ios_base :: sync_with_stdio (0) ;.Еще раз спасибо.