2009-06-02 7 views
4

Ich habe gelesen, dass alle STL-Container eine Spezialisierung des Swap-Algorithmus bieten, um zu vermeiden, den Kopierkonstruktor und zwei Zuweisungsoperationen aufzurufen, die die Standardmethode verwendet. Wenn ich jedoch dachte, dass es schön wäre, eine Warteschlange in einem Code zu verwenden, an dem ich gerade arbeitete, bemerkte ich, dass (im Gegensatz zu Vektor und Deque) die Warteschlange diese Methode nicht bietet? Ich habe mich entschieden, statt einer Schlange eine Deque zu benutzen, aber ich bin immer noch interessiert zu wissen, warum das so ist?Warum definiert Std-Warteschlange keine Swap-Methode-Spezialisierung

Antwort

3

C++0x wird Swap Container-Adapter wie Std :: Warteschlange hinzufügen. Ich konnte nur spekulieren, warum es im aktuellen Standard fehlt. In this discussion jemand schlägt eine Abhilfe:

Es gibt eine Lösung, da die Standard-geschützten die benötigten Teile macht, genannt Vererbung. [einfach über die Standardadapter nicht zerstören] Erstellen Sie eine Template-Struktur erben den gewünschten Adapter, nur die Konstruktoren und Weiterleiten der Argumente an die Adapterklasse, Schreiben eines Swap-Mitglied ist ein Kinderspiel, da die erforderlichen Elemente geschützte Mitglieder sind von die Standardadapter.

+0

Die Frage war "Gibt es einen Grund, warum es fehlt?" –

1

Ich bin sicher, dass sie als ein Versehen weggelassen wurden. Bei aller Fairness verwende ich std :: queue und std :: stack ziemlich viel und habe noch nie zwei ausgetauscht. Ich denke, Ihre Verwendung einer Deque statt einer Warteschlange ist in Ordnung. Etwas wie typedef std::deque<MyType> QueueType sollte einen Hinweis geben, wie der Container verwendet werden sollte.

+0

Ich führe zwei Sätze von Elementen, die verarbeitet werden müssen, die aktuelle Menge und die Menge, die in der nächsten Runde verarbeitet werden, also muss ich am Ende jeder Runde die aufgefüllte nextQueue anstelle der depleted currentQueue tauschen. Streng genommen müssen sie überhaupt keine Warteschlangen sein ... sie könnten einfach Vektoren sein ... hmmm –

+0

Haben Sie darüber nachgedacht, zwei Zeiger auf Warteschlangen zu haben und sie stattdessen zu tauschen? – rlbond

+0

@rlbond Wenn die Swap-Methode richtig definiert ist, tauschen die Container nur ihre internen Zeiger, so dass es effektiv das gleiche ist ... und ich hasse die Verwendung von Vektor * vec = neuer Vektor (Balken); Ich denke nur, es ist hässlich :) –

Verwandte Themen