/*------------------------------------------------------------------------------ * deque.cc: Fun with the STL deque **----------------------------------------------------------------------------*/ /* Copyright (c) 2009 Peter Bui. All Rights Reserved. * * Peter Bui * **------------------------------------------------------------------------------ * Includes **----------------------------------------------------------------------------*/ #include #include #include #include #include #include using namespace std; /*------------------------------------------------------------------------------ * Constants **----------------------------------------------------------------------------*/ #define NINTS 10 #define MAX_INT 100 enum { METHOD_INDEX, METHOD_ITERATOR, METHOD_COPY, NMETHODS }; /*------------------------------------------------------------------------------ * Functions **----------------------------------------------------------------------------*/ // Fill deque with random integers // Note: pass by reference, default values void fill_deque(deque &d, bool push_back = true, int max_int = MAX_INT, int nints = NINTS) { for (size_t i = 0; i < nints; i++) if (push_back) d.push_back(rand() % max_int); else d.push_front(rand() % max_int); } // Three different ways to traverse collection void print_deque(deque &d, int method = METHOD_INDEX) { switch (method) { case METHOD_INDEX: for (size_t i = 0; i < d.size(); i++) cout << d[i] << ' '; cout << endl; break; case METHOD_ITERATOR: for (deque::iterator it = d.begin(); it != d.end(); it++) cout << *it << ' '; cout << endl; break; case METHOD_COPY: copy(d.begin(), d.end(), ostream_iterator(cout, " ")); cout << endl; break; default: break; } } /*------------------------------------------------------------------------------ * Macros **----------------------------------------------------------------------------*/ #define PRINT_DEQUE_ALL(d) \ for (size_t i = 0; i < NMETHODS; i++) \ print_deque((d), i); #define PRINT_LINE(s) cout << "- " << (s) << ":" << endl; /*------------------------------------------------------------------------------ * Main Execution **----------------------------------------------------------------------------*/ int main(int argc, char *argv[]) { deque mDeque; srand(time(NULL)); PRINT_LINE("Fill deque with random numbers"); fill_deque(mDeque); PRINT_DEQUE_ALL(mDeque); PRINT_LINE("Erase a random range from the deque"); mDeque.erase(mDeque.begin(), mDeque.begin() + rand() % mDeque.size()); PRINT_DEQUE_ALL(mDeque); PRINT_LINE("Reverse deque"); reverse(mDeque.begin(), mDeque.end()); PRINT_DEQUE_ALL(mDeque); PRINT_LINE("Reverse a deque again"); reverse(mDeque.begin(), mDeque.end()); PRINT_DEQUE_ALL(mDeque); PRINT_LINE("Clear deque"); mDeque.clear(); PRINT_DEQUE_ALL(mDeque); PRINT_LINE("Fill back of deque"); fill_deque(mDeque); PRINT_DEQUE_ALL(mDeque); PRINT_LINE("Fill front of deque"); fill_deque(mDeque, false); PRINT_DEQUE_ALL(mDeque); PRINT_LINE("Drain front of deque"); size_t dsize = mDeque.size(); for (size_t i = 0; i < dsize / 2; i++) { cout << mDeque.front() << ' '; mDeque.pop_front(); } cout << endl; PRINT_LINE("Drain back of deque"); while (!mDeque.empty()) { cout << mDeque.back() << ' '; mDeque.pop_back(); } cout << endl; return (EXIT_SUCCESS); } /*------------------------------------------------------------------------------ * vim: sts=4 sw=4 ts=8 ft=cpp **----------------------------------------------------------------------------*/