web-dev-qa-db-fra.com

Comment supprimer l'élément qui n'est pas au sommet de la priorité_queue?

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.

28
ishan3243

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

26
alexm

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.

4
Y. Xu

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);
1
Amit Kumar