2010-10-06 9 views
21

Ich habe Anforderung wie folgt. Für eine Funktion bekomme ich Eingabe als Zahlenstrom. Ich meine, die Funktion wird immer mit einer einzigen Nummer bei jedem Anruf angerufen. Ich verwende Warteschlange zum Speichern von Zahlenströmen. Ich muss einen gesammelten Satz von Zahlen nur verarbeiten, wenn eine Bedingung erfüllt ist. Wenn die Bedingung nicht erfüllt ist, muss ich alle Elemente in die Warteschlange werfen und dann neue Nummern darin speichern. Zum Leeren der Warteschlange konnte ich die clear() -Methode nicht finden. Ich schleife also wie unten.Warum std :: queue unterstützt die Funktion clear() nicht?

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

Ich habe effizienten Algorithmus Warteschlange bei

How do I clear the std::queue efficiently?

Meine Frage ist für das Clearing: Warum Warteschlange nicht klar unterstützt() Funktion?

Wenn Deque und Vektor die clear() - Methode unterstützen, was ist die technische Schwierigkeit, sie für die Warteschlange zu unterstützen?

Oder ist meine obige Verwendung sehr selten und wird daher nicht unterstützt? Danke.

Antwort

19

Nach http://www.cplusplus.com/reference/stl/queue/,

Warteschlangen werden als Container-Adapter implementiert, die Klassen sind, die ein eingekapseltes Objekt einer bestimmten Containerklasse als zugrunde liegende Behälter zu verwenden, einen bestimmten Satz von Elementfunktionen bereitstellt es Elemente zugreifen .

was bedeutet, dass die Warteschlange einen bereits vorhandenen Container verwendet und nur eine Schnittstelle zu diesem Container als FIFO-Warteschlange ist.

Dies bedeutet, dass Warteschlangen nicht gelöscht werden sollen. Wenn Sie eine Warteschlange löschen müssen, bedeutet dies, dass Sie tatsächlich ein Objekt verwenden müssen, das keine Warteschlange ist, und daher sollten Sie stattdessen den tatsächlichen zugrunde liegenden Containertyp verwenden, der standardmäßig eine Deque ist.

+0

+1, obwohl, effiziente Clearing * ist * möglich, siehe meine Antwort. – sellibitze

+3

Also ich denke, 'std :: queue' ist eine eingeschränkte Warteschlange für sehr begrenzte Verwendungszwecke, ist die Nachricht? – bobobobo

+0

Der Grundgedanke hinter dem Warteschlangenadapter ist, dass Elemente, die eingefügt werden, an einem bestimmten Punkt extrahiert werden müssen und bei einer Löschoperation mit mehreren Elementen nicht verloren gehen. Ist das sinnvoll ?Nicht unbedingt, da es sowieso gelöscht werden kann ... – SirDarius

3

queue ist nur ein Adapter für einige zugrunde liegenden Container, standardmäßig eine deque, mit eingeschränkter Funktion (wie Sie hier angemerkt). Wenn Sie die vollständige Funktion verwenden möchten, verwenden Sie die zugrunde liegende deque anstelle von queue.

25

Abgesehen von dem, was bereits gesagt wurde, Sie können eine Warteschlange löschen ganz einfach:

queue<int> q; 
... 
q = queue<int>(); // Assign an empty queue 

oder in C++ 11

q = {}; 
+0

C++ 11 Version: 'q = {};' – Drax

+5

Obwohl, mit gcc 4.9.1 'q = {}' gibt den Fehler 'Konvertierung in std :: queue <...> von der Initialisiererliste würde expliziten Konstruktor verwenden. –

2

hinzugefügt dies meine wachsende Liste von ' STL-lesbare Funktionen:

template <typename T> 
void Clear(std::queue<T>& Queue) 
{ 
    Queue = std::queue<T>(); // Assign to empty queue 
} 

Es ist nur ein Wrapper um Sellibitzes ausgezeichnete Antwort, aber bedeutet, dass ich nicht jedes Mal, wenn ich die Technik verwende, auch einen Kommentar hinzufügen muss.

Verwandte Themen