Mega Code Archive

 
Categories / C++ Tutorial / Template
 

Generic stack based on vector

/* The following code example is taken from the book  * "C++ Templates - The Complete Guide"  * by David Vandevoorde and Nicolai M. Josuttis, Addison-Wesley, 2002  *  * (C) Copyright David Vandevoorde and Nicolai M. Josuttis 2002.  * Permission to copy, use, modify, sell and distribute this software  * is granted provided this copyright notice appears in all copies.  * This software is provided "as is" without express or implied  * warranty, and with no claim as to its suitability for any purpose.  */ #include <iostream> #include <deque> #include <cstdlib> #include <vector> #include <stdexcept> template <typename T, typename CONT = std::vector<T> > class Stack {   private:     CONT elems;               // elements   public:     void push(T const&);      // push element     void pop();               // pop element     T top() const;            // return top element     bool empty() const {      // return whether the stack is empty         return elems.empty();     } }; template <typename T, typename CONT> void Stack<T,CONT>::push (T const& elem) {     elems.push_back(elem);    // append copy of passed elem } template <typename T, typename CONT> void Stack<T,CONT>::pop () {     if (elems.empty()) {         throw std::out_of_range("Stack<>::pop(): empty stack");     }     elems.pop_back();         // remove last element } template <typename T, typename CONT> T Stack<T,CONT>::top () const {     if (elems.empty()) {         throw std::out_of_range("Stack<>::top(): empty stack");     }     return elems.back();      // return copy of last element } int main() {     try {         // stack of ints:         Stack<int> intStack;         // stack of doubles which uses a std::deque<> to manage the elements         Stack<double,std::deque<double> > dblStack;         // manipulate int stack         intStack.push(7);         std::cout << intStack.top() << std::endl;         intStack.pop();         // manipulate double stack         dblStack.push(42.42);         std::cout << dblStack.top() << std::endl;         dblStack.pop();     }     catch (std::exception const& ex) {         std::cerr << "Exception: " << ex.what() << std::endl;         return EXIT_FAILURE;  // exit program with ERROR status     } } 7 42.42 Exception: Stack::pop(): empty stack