2009-06-02 5 views
4

J'ai lu que tous les conteneurs stl fournissent une spécialisation de l'algorithme d'échange afin d'éviter d'appeler le constructeur de copie et deux opérations d'affectation que la méthode par défaut utilise. Cependant, quand j'ai pensé que ce serait bien d'utiliser une file d'attente dans un code sur lequel je travaillais j'ai remarqué que (contrairement à vector et deque) la file d'attente ne fournit pas cette méthode? J'ai juste décidé d'utiliser un deque au lieu d'une file d'attente, mais je suis toujours intéressé de savoir pourquoi c'est?Pourquoi la file d'attente std ne définit pas une spécialisation de méthode d'échange

Répondre

3

C++0x va ajouter un échange aux adaptateurs de conteneur comme std :: queue. Je pourrais seulement spéculer pourquoi il manque de la norme actuelle. Dans this discussion quelqu'un propose une solution de contournement:

Il y a une solution, car la norme rend les pièces nécessaires, protégées appelé héritage. [juste ne pas détruire via les adaptateurs std] créer une structure de modèle héritant de l'adaptateur désiré, fournir seulement les constructeurs et transmettre les arguments à la classe de l'adaptateur, en écrivant un membre de swap est un accroc puisque les éléments requis sont des membres protégés de les adaptateurs standards.

+0

La question était "Y at-il une raison pour laquelle il manque?" –

1

Je suis sûr qu'ils ont été omis comme un oubli. En toute honnêteté, j'utilise un peu std :: queue et std :: stack et je n'ai jamais eu à en échanger deux. Je pense que votre utilisation d'un deque au lieu d'une file d'attente est bien. Quelque chose comme typedef std::deque<MyType> QueueType devrait donner assez d'un indice comment le conteneur devrait être utilisé.

+0

Je maintiens deux ensembles d'éléments qui nécessitent un traitement, l'ensemble actuel et l'ensemble à traiter au tour suivant, donc j'ai besoin d'échanger le fichier nextQueue rempli à la place de currentQueue appauvri à la fin de chaque tour. Strictement parlant, ils n'ont pas du tout à faire la queue ... ils pourraient juste être des vecteurs en fait ... hmmm –

+0

Avez-vous envisagé d'avoir deux pointeurs vers les files d'attente, et de les échanger à la place? – rlbond

+0

@rlbond Lorsque la méthode d'échange est définie correctement, les conteneurs ne font qu'échanger leurs pointeurs internes, donc c'est effectivement la même chose ... et je déteste utiliser le vecteur * vec = new vector (bar); Je pense juste que c'est moche :) –

Questions connexes