Code Fragment: HPQ1



template <typename Key, typename Element, typename Comp>
class HeapPriorityQueue { 
protected: 						// typename shortcuts
  typedef Item<Key, Element>	    Item; 		// (key, element) pair
  typedef VectorHeapTree<Item>	    HeapTree;		// a heap of items
  typedef HeapTree::Position	    Position;		// a position in heap
protected: 						// local utilities
  const Key& key(const Position& p) const 		// position's key
    { return p.element().key(); }
  Element& element(const Position& p)			// position's element
    { return p.element().element(); }
private: 						// member data
  HeapTree    T;					// heap tree
  Comp	      comp;					// comparator
public:
  HeapPriorityQueue(int capac = 100)			// constructor
    : T(capac), comp() { }
  int size() const 					// number of elements
    { return (T.size()-1)/2; }
  bool isEmpty() const  				// is the queue empty?
    { return size() == 0; }

  void insertItem(const Key& k, const Element& e);	// insert (key, element)

  Element& minElement()					// return min element
      throw(EmptyContainerException) {
    if (isEmpty())
      throw EmptyContainerException("Minimum element of empty queue");
    return element(T.root());
  }
  const Key& minKey() const 				// return minimum key
      throw(EmptyContainerException) {
    if (isEmpty())
      throw EmptyContainerException("Minimum key of empty queue");
    return key(T.root());
  }
  void removeMin() throw(EmptyContainerException);	// remove minimum
};