// // simplified implementation of deque data type // // Described in Chapter 11 of // Data Structures in C++ using the STL // Published by Addison-Wesley, 1997 // Written by Tim Budd, budd@cs.orst.edu // Oregon State University // // // class deque // double ended queue // // class dequeIterator // iterator protocol for deque template class dequeIterator { friend class deque; typedef dequeIterator iterator; public: // constructors dequeIterator (deque * d, int i) : theDeque(d), index(i) { } dequeIterator (dequeIterator & d) : theDeque(d.theDeque), index(d.index) { } // iterator operations T & operator * () { return (*theDeque)[index]; } iterator & operator ++ (int) { ++index; return * this; } iterator operator ++ (); // prefix change iterator & operator -- (int) { --index; return * this; } iterator operator -- (); // postfix change bool operator == (iterator & r) { return theDeque == r.theDeque && index == r.index; } bool operator < (iterator & r) { return theDeque == r.theDeque && index < r.index; } T & operator [ ] (unsigned int i) { return (*theDeque) [index + i]; } void operator = (iterator & r) { theDeque = r.theDeque; index = r.index; } iterator operator + (int i) { return iterator(theDeque, index + i); } iterator operator - (int i) { return iterator(theDeque, index - i); } protected: deque * theDeque; int index; }; # include template class deque { public: typedef dequeIterator iterator; typedef T value_type; // constructors deque () : vecOne(), vecTwo() { } deque (unsigned int size, T & initial) : vecOne (size/2, initial), vecTwo (size - (size / 2), initial) { } deque (deque & d) : vecOne(d.vecOne), vecTwo(d.vecTwo) { } // operations T & operator [ ] (unsigned int); T & front (); T & back (); bool empty () { return vecOne.empty () && vecTwo.empty (); } iterator begin () { return iterator(this, 0); } iterator end () { return iterator(this, size ()); } void erase (iterator); void erase (iterator, iterator); void insert (iterator, T &); int size () { return vecOne.size () + vecTwo.size (); } void push_front (T & value) { vecOne.push_back(value); } void push_back (T & value) { vecTwo.push_back(value); } void pop_front (); void pop_back (); protected: vector vecOne; vector vecTwo; }; template T & deque::front () // return first element in deque { if (vecOne.empty ()) return vecTwo.front (); else return vecOne.back (); } template void deque::pop_front () // remove first element in deque { if (vecOne.empty ()) vecTwo.erase(vecTwo.begin ()); else vecOne.pop_back (); } template T & deque::operator [ ] (unsigned int index) // return given element from deque { int n = vecOne.size (); if (index <= n) return vecOne [ (n-1) - index ]; else return vecTwo [ index - n ]; } template dequeIterator dequeIterator::operator ++ (int) // postfix form of increment { // clone, update, return clone deque::iterator clone(theDeque, index); index++; return clone; } template void deque::erase (dequeIterator itr) // erase value from deque { int index = itr.index; int n = vecOne.size (); if (index < n) vecOne.erase (vecOne.begin () + ((n-1) - index)); else vecTwo.erase (vecTwo.begin () + (n - index)); }