2010-12-11 3 views
3

Ich habe ein College-Programmierprojekt in C++ in zwei Teile unterteilt. Ich beginne den zweiten Teil, wo es priority_queues, hash tables und BST 's verwenden soll.Liste zur Prioritätswarteschlange

Ich habe Probleme (zumindest) mit Priority Queues, da es mich verpflichtet, eine Menge Code, der bereits im ersten Teil implementiert wurde, zu wiederholen.

Das Projekt es geht darum, ein einfaches Flughafenmanagementsystem zu implementieren und deshalb habe ich Klassen wie Flughafen (Hauptklasse), Flugzeug, Terminal und Flug. Mein Flughafen hatte eine list von Terminals, aber jetzt die Projektspezifikation weist darauf hin, dass ich die Terminals in einerpriority_queue halten muss, wo die Spitze enthält das Terminal weniger besetzt, d. H. Weniger Flüge.

Für jede Klasse habe ich CRUD-Funktionen, aber wie soll ich zum Beispiel ein Terminal bearbeiten und einen Flug hinzufügen? Mit einer Liste musste ich nur zu einer bestimmten Position iterieren, aber jetzt habe ich nur Zugriff auf das Objekt oben in der Warteschlange. Die Lösung, über die ich nachdachte, war, die Terminals der Prioritätswarteschlange in eine temporäre Liste zu kopieren, aber ehrlich gesagt mag ich diesen Ansatz nicht.

Was soll ich tun?

Vielen Dank im Voraus.

+0

Wissen Sie, wie ein Element aus einer Prioritätswarteschlange abzurufen? Wissen Sie, wie Sie in eine Prioritätswarteschlange einfügen? Was sind die Voraussetzungen für Ihre Benutzeroberfläche genau? Warum, genau, denkst du, dass du die 'Terminals' in einer Prioritätswarteschlange halten musst? –

+0

@Karl Knechtel: 'top()' zum Abrufen des ersten Elements, 'push' zum Einfügen eines Elements und' pop' zum Entfernen des ersten Elements. Ich brauche CRUD-Funktionen für jede Klasse in der Implementierung. Das System muss den Benutzer alle typischen Aktionen ausführen lassen, die Sie hätten, wenn Sie einen Flughafen verwalten müssten: ** create ** 'airplanes', ** create **' flights', ** create ** 'terminals', ** Mitarbeiter ** "Flugzeuge" und "Flüge", ** Mitarbeiter ** "Flüge" und "Terminals". Wo ich 'add' geschrieben habe, kann es durch die anderen ** CRUD ** Funktionen (lesen, aktualisieren und löschen) ersetzt werden. –

+1

Wenn Sie eine Prioritätswarteschlange verwenden müssen, können Sie nur eine Prioritätswarteschlange verwenden? Oder dürfen Sie Zeiger auf die Terminals in einer Prioritätswarteschlange und einer Hashtabelle oder BST speichern? – outis

Antwort

2

Es klingt, als ob Sie eine Prioritätswarteschlange mit effizientem Erhöhen und Verringern der Tastenvorgänge benötigen. Sie können besser Ihre eigene Implementierung der Prioritätswarteschlange erstellen.

Der Container priority_queue eignet sich hervorragend für dynamische Sets. Aber da die Anzahl der Terminals in einem Flughafen ziemlich fest ist, können Sie einen Container mit fester Größe mit der Heap-Familie von Algorithmen.

Als interner Speicher können Sie einen beliebigen Container verwenden, der Direktzugriffsiteratoren (Vektor, Array, Deque) bereitstellt. Verwenden Sie dann die Funktionsfamilie make_heap(), sort_heap(), um das Array zu häufen. Jetzt können Sie billig auf das top() zugreifen, die Priorität eines zufälligen Members im Heap ändern und alle Elemente einfach durchlaufen. siehe

Ein Beispiel: http://www.cplusplus.com/reference/algorithm/make_heap/