// File: Array.h // Template array class definition and implementation // Written by Daniel Spiegel #ifndef ARRAY_H #define ARRAY_H #include #include using namespace std; template class Array { public: // default constructor Array(int n = 10); // constructor initializes elements to given value Array(int n, const eltType &val); // constructor initializes from a standard array Array(const eltType A[], int n); // copy constructor Array(const Array &A); // destructor ~Array(); // append element to array Array &operator+=(eltType); // inspector for size of the list int size() const { return items; } // assignment operator Array &operator=(const Array &A); // inspector for element of a constant list const eltType& operator[](int i) const; // inspector for element of a nonconstant list eltType& operator[](int i); private: // data members eltType *elements;// pointer to list elements int items; // size of list }; // default constructor template Array::Array(int n) { assert(n > 0); items = n; elements = new eltType [n]; assert(elements); } // constructor initializes elements to given value template Array::Array(int n, const eltType &val) { assert(n > 0); items = n; elements = new eltType [n]; assert(elements); for (int i = 0; i < n; ++i) { elements[i] = val; } } // constructor initializes from a standard array template Array::Array(const eltType A[], int n) { assert(n > 0); items = n; elements = new eltType [n]; assert(elements); for (int i = 0; i < n; ++i) { elements[i] = A[i]; } } // copy constructor template Array::Array(const Array &A) { items = A.size(); elements = new eltType [A.size()]; assert(elements); for (int i = 0; i < A.size(); ++i) elements[i] = A[i]; } // destructor template Array::~Array() { delete [] elements; } // Append element to array template Array &Array::operator+=(eltType elt) { eltType *temp=new eltType[items+1]; for (int i = 0; i < size(); ++i) temp[i]=elements[i]; temp[items++]=elt; delete [] elements; elements=temp; return(*this); } // assignment template Array& Array::operator=(const Array &A) { if (this != &A) { if (size() != A.size()) { delete [] elements; items = A.size(); elements = new eltType [A.size()]; assert(elements); } for (int i = 0; i < A.size(); ++i) elements[i] = A[i]; } return *this; } // inspector of the value of an individual element template const eltType& Array::operator[](int i) const { assert((i >= 0) && (i < size())); return elements[i]; } // inspector/mutator facilitator of individual element template eltType& Array::operator[](int i) { assert((i >= 0) && (i < size())); return elements[i]; } // template insertion operator for Array template ostream& operator<<(ostream &sout, const Array &A){ sout << "[ "; for (int i = 0; i < A.size(); ++i) sout << A[i] << " "; sout << "]"; return sout; } // insertion operator for Array ostream& operator<<(ostream &sout,const Array &A) { for (int i = 0; i < A.size(); ++i) sout << A[i]; return sout; } #endif