📄 array2d.h
字号:
#ifndef Array2D_
#define Array2D_
#include "xcept.h"
#include "array1d.h"
template<class T>
class Array2D {
friend ostream& operator<<
(ostream&, const Array2D<T>&);
public:
Array2D(int r = 0, int c = 0);
Array2D(const Array2D<T>& m); // copy constructor
~Array2D() {delete [] row;}
int Rows() const {return rows;}
int Columns() const {return cols;}
Array1D<T>& operator[](int i) const;
Array2D<T>& operator=(const Array2D<T>& m);
Array2D<T> operator+() const; // unary +
Array2D<T> operator+(const Array2D<T>& m) const;
Array2D<T> operator-() const; // unary minus
Array2D<T> operator-(const Array2D<T>& m) const;
Array2D<T> operator*(const Array2D<T>& m) const;
Array2D<T>& operator+=(const T& x);
private:
int rows, cols; // array dimensions
Array1D<T> *row; // array of 1D arrays
};
template<class T>
Array2D<T>::Array2D(int r, int c)
{// Constructor for two-dimensional arrays.
// validate r and c
if (r < 0 || c < 0) throw BadInitializers();
if ((!r || !c) && (r || c))
throw BadInitializers();
rows = r;
cols = c;
// allocate r 1D arrays of default size
row = new Array1D<T> [r];
// make them right size
for (int i = 0; i < r; i++)
row[i].ReSize(c);
}
template<class T>
Array2D<T>::Array2D(const Array2D<T>& m)
{// Copy constructor for two-dimensional arrays.
rows = m.rows;
cols = m.cols;
// allocate array of 1D arrays
row = new Array1D<T> [rows];
// copy each row
for (int i = 0; i < rows; i++)
row[i] = m.row[i];
}
template<class T>
Array2D<T>& Array2D<T>::operator=(const Array2D<T>& m)
{// Assignment. (*this) = m.
if (this != &m) {// not self assignment
delete [] row;
rows = m.rows; cols = m.cols;
row = new Array1D<T> [rows];
// copy each row
for (int i = 0; i < rows; i++)
row[i] = m.row[i];
}
return *this;
}
template<class T>
Array1D<T>& Array2D<T>::operator[](int i) const
{// First index of 2D array.
if (i < 0 || i >= rows) throw OutOfBounds();
return row[i];
}
template<class T>
Array2D<T> Array2D<T>::
operator+(const Array2D<T>& m) const
{// Return w = (*this) + m.
if (rows != m.rows || cols != m.cols)
throw SizeMismatch();
// create result array w
Array2D<T> w(rows,cols);
for (int i = 0; i < rows; i++)
w.row[i] = row[i] + m.row[i];
return w;
}
template<class T>
Array2D<T> Array2D<T>::
operator-(const Array2D<T>& m) const
{// Return w = (*this) - m.
if (rows != m.rows || cols != m.cols)
throw SizeMismatch();
// create result array w
Array2D<T> w(rows,cols);
for (int i = 0; i < rows; i++)
w.row[i] = row[i] - m.row[i];
return w;
}
template<class T>
Array2D<T> Array2D<T>::operator-() const
{// Return w = -(*this).
// create result array w
Array2D<T> w(rows, cols);
for (int i = 0; i < rows; i++)
w.row[i] = -row[i];
return w;
}
template<class T>
Array2D<T> Array2D<T>::
operator*(const Array2D<T>& m) const
{// A matrix product. Return w = (*this) * m.
if (cols != m.rows) throw SizeMismatch();
// create result array w
Array2D<T> w(rows, m.cols);
for (int i = 0; i < rows; i++)
for (int j = 0; j < m.cols; j++) {
T sum = (*this)[i][0] * m[0][j];
for (int k = 1; k < cols; k++)
sum += (*this)[i][k] * m[k][j];
w[i][j] = sum;
}
return w;
}
template<class T>
Array2D<T>& Array2D<T>::operator+=(const T& x)
{// Increment each element of (*this) by x.
for (int i = 0; i < rows; i++)
row[i] += x;
return *this;
}
template<class T>
ostream& operator<<(ostream& out,
const Array2D<T>& x)
{// Put the array elements into the stream out.
for (int i = 0; i < x.rows; i++)
out << x.row[i] << endl;
return out;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -