Queue in veränderter Reihenfolge ausgeben



  • Hallo ihr!

    Da mir heir beim letzten Mal so nett geholfen wurde frage ich noch mal...
    Gibt es eine einfache Möglichkeit einen Teil einer std::queue in einer veränderten Reihenfolge wiederzugeben? Also erst das 5. Element, dann das 2., dann das 6., dann das 1., dann das 7. und von dort an bis an Ende in der normalen Reihenfolge.

    Komische Frage, ich weiß. Aber ich bräuchte das genau so. Vor allem soll die Reihenfolge erst bei der Ausgabe geändert werden, noch nicht beim einlesen.

    Vielen lieben Dank.

    LG,
    Sarah 🤡



  • Bei einer std::queue kannst du nur das erste Element direkt greifen (die ist auch nur ein Adapter, der auf die STL Container aufsetzt). Bei einem vollwertigen Container kannst du jedes Element erreichen.

    Randfrage: Was soll das darstellen? Und wodurch bestimmst du die Ausgabe-Reihenfolge?



  • Es geht um eine Liste von Städtenamen die umsortiert werden soll... Ist nur eine Übrung für ein Uniseminar die ich mir selber ausgedacht habe.

    Dann werde ich die einzelnen Elemente also vor dem Einlesen umsortieren müssen, ja? 😕



  • Falls du es nur in verkehrter Reihenfolge ausgeben willst (nur so für den Fall), kannst du einen Reverse Iterator verwenden.



  • nein, aber du kannst den container sortieren lassen

    sortieren heisst ja nicht nur sortiert ausgeben lassen, sondern auch wirklich sortieren, sodass die reihenfolge der elemente geändert ist



  • Sarah83 schrieb:

    Dann werde ich die einzelnen Elemente also vor dem Einlesen umsortieren müssen, ja? 😕

    Oder du nutzt einen vollwertigen Container ( std::vector , std::list oder std::deque ).



  • Sarah83 schrieb:

    Es geht um eine Liste von Städtenamen die umsortiert werden soll... Ist nur eine Übrung für ein Uniseminar die ich mir selber ausgedacht habe.

    Dann werde ich die einzelnen Elemente also vor dem Einlesen umsortieren müssen, ja? 😕

    Eventuell wäre auch eine priority_queue für dich geeignet.



  • Danke für die vielen Antworten 🙂

    Sollte auf jeden Fall ein Queue sein. Ich gucke mir dann mal den priority Queue an. 🤡



  • Sarah83 schrieb:

    Sollte auf jeden Fall ein Queue sein.

    Warum ist dir denn dieser Punkt so wichtig? Die Möglichkeiten einer Queue sind beschränkt (neues Element einfügen, ältestes Element herausholen), damit wirst du deine Sortierung nicht hinbekommen.



  • Eine std::deque kann alles was auch std::queue kann und noch viel mehr, da std::queue lediglich ein Adapter davon ist, was CStoll bereits gesagt hat.



  • Weil ich eigentlich eine Übung mit Queues machen wollte...
    Aber welcher Container bietet sich für mein Vorhaben denn besonders an?



  • Nimm so viel wie möglich std::vector !



  • Queue ist kein Container 😉 Oder meinst du eigentlich deque?

    Ansonsten: Die sequentiellen Container (vector/deque/list) kannst du vor der Ausgabe sortieren, die assoziativen Container (set/map) sind bereits von sich aus sortiert. Und priority_queue liefert dir auf Anfrage das "größte" Element zurück (wobei du selber definieren kannst, was als "größtes Element" gilt).



  • Sarah83 schrieb:

    Aber welcher Container bietet sich für mein Vorhaben denn besonders an?

    Wenn das "verdrehte" Ausgeben die einzige Anforderung ist, dann ein std::vector .
    Wenn du zusätzlich etwas Queue-artiges brauchst (z.B: push_back() + pop_front() ), dann std::deque .

    Wobei, machen kannst du das mit jedem Container, auch mit einer reinen Liste oder Queue. Du müsstest dazu ja bloss die ersten 7 Elemente rausholen und zwischenspeichern (reicht auch Iteratoren auf die ersten 7 Elemente zwischenzuspeicher), diese dann "verdreht" rum ausgeben, und den Rest dann ganz normal durchlaufen.



  • Ah super. Das klingt beides gut.
    Ich habe mir vorgestellt die ersten 7 Einträge einfach mit einer Gewichtung zu versehen. Das ist dann ja quasi genau das was für priority_queue nötig ist, oder?



  • Ich wüsste nicht wozu man hier eine Priority-Queue einsetzen sollte.



  • Eine Queue ist ein Ding, wo sich immer hinten welche anstellen, und vorne welche raus gehen können. Der, der sich zuerst angestellt hat, darf auch zuerst wieder raus.
    Bei einer priorisierbaren Queue haben bestimmte sich Anstellende Sonderausweise, mit denen sie sich verdrängeln dürfen. Trotzdem müssen sie immer vorne raus.
    Du willst etwas haben, wo sich mitten drin Leute bewegen können. Die sollen auch raus gehen dürfen. Das geht aber in einer Queue nicht. Ergo hat eine Queue keinen Sinn.


Anmelden zum Antworten