⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 array2d.h

📁 data structures, algorithms and Application书的源代码
💻 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 + -