Dans mon programme, je dois supprimer un élément d'une file d'attente prioritaire qui n'est pas en haut. Cela peut-il être fait? Sinon, veuillez suggérer un moyen de le faire, sauf en créant votre propre tas.
Le standard priority_queue<T>
peut être personnalisé par héritage. Il a protégé les membres c
et comp
qui peuvent être référencés dans une classe descendante.
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 << ", ";
}
}
}
Production:
10, 4, 3, 2
Pradip et MASh sacrifient le temps pour réaliser l'opération de suppression. Mais si la complexité temporelle est importante pour vous, je vous suggère d'utiliser le hachage min_heap. Une table de hachage stocke le pointeur de valeur et les pointeurs pointent vers un min_heap. Ce qui signifie que vous pouvez passer O(1) temps pour trouver la valeur dans min_heap et O(log(n)) pour supprimer (tamisage ou tamisage) vers le bas) l'élément.
La meilleure solution consiste à utiliser std :: set. Les ensembles fournissent des méthodes qui permettent de l'utiliser à la fois comme un tas min/max (ou comme file d'attente prioritaire).
std::set<int> pq;
//accessing the smallest element(use as min heap)
*pq.begin();
//accessing the largest element (use as max heap)
*pq.rbegin();
De plus, les ensembles permettent également la suppression aléatoire.
//to delete the integer '6'
auto it = pq.find(6);
pq.erase(it);