/********************************************************************* Filename: vect_it.cpp Section: 13 Templates Compiler: Borland C++ Version 5.0 Summer 1996 C++ Distilled: Descriptions, Prescriptions and Style By Ira Pohl *********************************************************************/ //templates for vect with associated iterator class #include #include //for assert template class vect_iterator; template class vect { public: //constructors and destructor typedef T* iterator; explicit vect(int n = 10);//default constructor vect(const vect& v);//copy constructor vect(const T a[], int n);//from array ~vect() { delete [] p; } iterator begin(){ return p;} iterator end(){ return p + size;} T& operator[](int i) const; vect& operator=(const vect& v); friend vect operator+(const vect& v1, const vect& v2); friend ostream& operator<<(ostream& out, const vect& v); friend class vect_iterator; private: T* p; //base pointer int size; //number of elements }; //default constructor //default constructor template vect::vect(int n = 10): size(n) { assert(n > 0); p = new T[size]; assert(p != 0); } //copy constructor template vect::vect(const vect& v) { size = v.size; p = new T[size]; assert (p != 0); for (int i = 0; i < size; ++i) p[i] = v.p[i]; } //Initializing vect from an array template vect::vect(const T a[], int n) : size (n) { assert (n > 0); p = new T[size]; assert (p != 0); for (int i = 0; i < size; ++i) p[i] = a[i]; } //overloaded subscript operator template T& vect::operator[](int i) const { assert (i >= 0 && i < size); return p[i]; } //overloaded output operator template ostream& operator<<(ostream& out, const vect& v) { for (int i = 0; i <= (v.size-1); ++i) out << v.p[i] << '\t'; return (out << endl); } template vect& vect::operator= (const vect& v) { assert(v.size == size); for (int i = 0; i < size; ++i) p[i] = v.p[i]; return (*this); } template vect operator+(const vect& v1, const vect& v2) { int s = (v1.size < v2.size) ? v1.size : v2.size; vect sum(s); if (v1.size != v2.size) cerr << "adding different size arrays " << v1.size << " and " << v2.size << endl; for (int i = 0; i < s; ++i) sum.p[i] = p[i] + v.p[i]; return sum; } template void init_vect(vect& v, int start, int incr) { for (int i = 0; i <= v.ub(); ++i) { v[i] = start; start += incr; } } int main() { vect v(5); vect::iterator p ; int i = 0; for (p = v.begin() ; p != v.end(); ++p) *p = 1.5 + i++; do { --p; cout << *p << " , "; } while (p != v.begin()); cout << endl; }