In my program I need to delete an element from a priority queue that is not at the top. Can that be done? If not, please suggest a way to do so except creating your own heap.
pop() function is used to remove the top element of the priority queue.
You can use an index that contain the position of each element, and after if you want delete an element you use his position v(i). There are a lot of method, dependig by your algorithms. If you need to perform operations on elements in the middle, you need a List, not a Queue. It's conceptually wrong to do otherwise.
The standard priority_queue<T>
can be customized through inheritance. It has protected members c
and comp
that can be referenced in a descendant class.
template<typename T> class custom_priority_queue : public std::priority_queue<T, std::vector<T>> { public: bool remove(const T& value) { auto it = std::find(this->c.begin(), this->c.end(), value); if (it != this->c.end()) { this->c.erase(it); std::make_heap(this->c.begin(), this->c.end(), this->comp); return true; } else { return false; } } }; void main() { custom_priority_queue<int> queue; queue.push(10); queue.push(2); queue.push(4); queue.push(6); queue.push(3); queue.remove(6); while (!queue.empty()) { std::cout << queue.top(); queue.pop(); if (!queue.empty()) { std::cout << ", "; } } }
Output:
10, 4, 3, 2
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With