#pragma once #include #include #include using namespace std; template class PriorityQueue { private: // Nested class. class PriorityItem { private: int priority; T item; public: PriorityItem(T item_, int priority_) : item(item_), priority(priority_) { cout << "PriorityItem ctor!" < queue; void SortAccordingToPriority(); public: // Public interface. PriorityQueue(); ~PriorityQueue(); void AddItem(T item_, int priority_); void RemoveItem(); void DisplayQueue() const; }; template PriorityQueue::PriorityQueue() { cout << "PriorityQueue ctor!" << endl; } template PriorityQueue::~PriorityQueue() { cout << "PriorityQueue dtor!" << endl; } template void PriorityQueue::SortAccordingToPriority() { queue.sort(); } template void PriorityQueue::AddItem(T item_, int priority_) { queue.push_back(PriorityItem(item_,priority_)); SortAccordingToPriority(); // You have to overload PriorityItem::operator< for this to work... } template void PriorityQueue::RemoveItem() { SortAccordingToPriority(); typename list::iterator iter = queue.begin(); queue.erase(iter); } template void PriorityQueue::DisplayQueue() const { typename list::const_iterator iter; for (iter = queue.begin(); iter != queue.end(); iter++) { cout << iter->ToString(); } } // PriorityQueue::PriorityItem methods template string PriorityQueue::PriorityItem::ToString() const { stringstream stm; stm << item << " " << priority < void PriorityQueue::PriorityItem::DisplayPriorityItem() const { cout << ToString(); } template int PriorityQueue::PriorityItem::GetPriority() const { return priority; } template bool PriorityQueue::PriorityItem::operator<(const PriorityItem& other_) const { return this->GetPriority() < other_.GetPriority(); }