動的に割り当てられた配列のサイズを変更する方法を作成しようとしています。私は行と列を追加することができますが、元のサイズよりも小さくなるようにサイズを変更することはできません。C++で動的に割り当てられた配列を小さなサイズに変更する
template <class T>
class Matrix
{
public:
// Constructors/Destructors
Matrix();
Matrix(const int rows, const int cols);
Matrix(const Matrix<T>& orig);
~Matrix();
// Display
void print() const;
// Size modification
void addRow();
void addCol();
void resize(const int rows, const int cols);
// Element access
T getCell(const int r, const int c) const;
// Operator Access
T& operator()(const int r, const int c) { return mData[r * mCols + c]; }
const T& operator()(const int r, const int c) const { return mData[r * mCols + c]; }
// Getters/Setters
int getRows() const;
int getCols() const;
private:
T* mData;
int mRows, mCols;
};
//1
template <class T>
Matrix<T>::Matrix(void){
mRows=0;
mCols=0;
mData=NULL;
}
//2
template <class T>
Matrix<T>::Matrix(const int rows, const int cols){
if(rows!=0&&cols!=0)
{
mRows=rows;
mCols=cols;
int size = rows*cols;
mData = new T[size];
for(int r=0;r<getRows();r++)
{
for(int c=0;c<getCols();c++)
{
mData[r * mCols + c]=0;
}
}
}else
{
mData=NULL;
}
}
//3
template <class T>
Matrix<T>::Matrix(const Matrix<T>& orig){
if(orig.getRows()!=0&&orig.getCols()!=0)
{
T* temp = mData;
mRows=orig.getRows();
mCols=orig.getCols();
int size = mRows*mCols;
mData = new T[size];
for(int r=0;r<getRows();r++)
{
for(int c=0;c<getCols();c++)
{
mData[r * mCols + c]=temp[r * mCols + c];
}
}
}else
{
mData=NULL;
}
}
//4
template <class T>
Matrix<T>::~Matrix()
{
delete []mData;
mData=NULL;
}
//5
template <class T>
void Matrix<T>::print() const{ //to print the mData in a Matrix form
cout << endl;
int r=0,c=0,w=10;
for(r=0;r<getRows();r++){
for(c=0;c<getCols();c++){
cout << setw(w) << mData[r * mCols + c];
}
cout << endl;
}
}
//6
template <class T>
void Matrix<T>::addRow(){
T* temp = mData;
mRows=getRows()+1;
int size = mRows*mCols;
mData = new T[size];
for(int r=0;r<getRows();r++)
{
for(int c=0;c<getCols();c++)
{
if(r==getRows()-1)
{
mData[r * mCols + c]=0;
}else
{
mData[r * mCols + c]=temp[r * mCols + c];
}
}
}
}
//7
template <class T>
void Matrix<T>::addCol(){
T* temp = mData;
mCols=getCols()+1;
int size = mRows*mCols;
mData = new T[size];
for(int r=0;r<getRows();r++)
{
for(int c=0;c<getCols()-1;c++)
{
mData[r * mCols + c]=temp[r * (mCols-1) + c];
}
}
int c=getCols()-1;
for(int r=0;r<getRows();r++)
{
mData[r * mCols + c]=0;
}
}
//8
template <class T>
void Matrix<T>::resize(const int rows, const int cols){
if(rows>=getRows())
{
while(rows!=getRows())
{
addRow();
}
}
if(cols>=getCols())
{
while(cols!=getCols())
{
addCol();
}
}
T* temp = mData;
int tempCols = getCols();
int size = rows*cols;
if(rows<getRows() || cols <getCols())
{
delete []mData;
mData=NULL;
mData= new T[size];
for(int r=0;r<getRows();r++)
{
for(int c=0;c<getCols();c++)
{
if(r<rows&&c<cols)
{
mData[r * mCols + c]=temp[r * (cols) + c];
}else
{
mData[r * mCols + c]=NULL;
}
}
}
}
}
//9
template <class T>
T Matrix<T>:: getCell(const int r, const int c) const
{
T value;
if(r<getRows()&&c<getCols()&&r>=0&&c>=0)
{
value = mData[r * mCols + c] ;
}else
{
value = 0;
}
return(value);
}
//22
template <class T>
int Matrix<T>::getRows() const{
return mRows;
}
//23
template <class T>
int Matrix<T>::getCols() const{
return mCols;
}
#endif
私が実装している他のすべての機能は完全に機能し、テストに役立つ移植を追加しました。
現在、マトリックスが3,4の場合、4,7に増やしたい場合、それは成功します。しかし、それを試して、それを2,2に切り捨てるならば、それは新しいサイズとループのためにそれが小さくなったはずであるにもかかわらず、3,4のままです。
ので、私の質問は、しかし、私は(3,4)マトリックスM1
1 2 3 4
6 7 8 2
3 2 1 1
を持っている場合、私はm1.resize(2,7)を実行する場合、私は
1 2 3 4 0 0 0
6 7 8 2 0 0 0
を取得したいということです現在取得しています
3801280 3802496 2 3 4 0 0
6 7 8 2 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
私のサイズ変更の実装には何が問題になっていますか?
あなたの質問は何ですか? "Something explodes"は質問ではありません –
'std :: vector'を内部的に保持してみませんか? – Charles
不幸にも、動的割り当て配列を使用してMatrix クラスを実装することで、抽象データ型(ADT)を理解することが課題です。 –