201 votes

Comment effacer efficacement le std::queue ?

J’utilise std::queue pour implémenter la classe JobQueue. (Fondamentalement cette classe traite chaque travail d’une manière FIFO). Dans un scénario, je veux effacer la file d’attente d’un seul coup (supprimer toutes les tâches de la file d’attente). Je ne vois aucune méthode clear disponible dans la classe std::queue.

Comment implémenter efficacement la méthode clear pour JobQueue classe ?

J’ai une solution simple de popping dans une boucle, mais je suis à la recherche de meilleurs moyens.

304voto

Un idiome commun pour conteneurs standard de compensation est en échangeant avec une version vide du conteneur :

C’est aussi la seule façon de réellement effacement de la mémoire qui s’est tenue à l’intérieur de certains conteneurs (std::vector)

33voto

janis Points 41

"David Rodriguez', 'anon' Auteur du sujet demandé comment faire pour effacer la file d'attente "de manière efficace", donc je suppose qu'il veut mieux la complexité de linéaire O(taille de file d'attente). Les méthodes que vous avez servi la même complexité: selon stl de référence, l'opérateur = est de complexité O(taille de file d'attente). À mon humble avis c'est parce que chaque élément de la file d'attente est réservé séparément, et il n'est pas alloué, dans un grand bloc de mémoire, comme dans le vecteur. Donc, pour effacer la mémoire, nous avons pour supprimer chaque élément séparément. Donc, la plus droite pour effacer stl::queue est en ligne:

while(!Q.empty()) Q.pop();

5voto

typ1232 Points 3309

Vous pouvez créer une classe qui hérite de la file d’attente et désactivez le conteneur sous-jacent directement. C’est très efficace.

Peut-être vous avez une implémentation permet également votre objet de file d’attente (ici ) d’hériter de au lieu d’avoir la file d’attente comme une variable de membre. De cette façon, vous auriez accès direct aux `` dans les fonctions de vos membres.

1voto

Marste, les destructeurs sont appelés correctement lorsque vous faites un échange avec un récipient vide (j’ai juste vérifié cela avec un code simple).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X