queue STL



  • Wie durchlaufe ich eine queue der STL ohne den Inhalt zu löschen?



  • frager schrieb:

    Wie durchlaufe ich eine queue der STL ohne den Inhalt zu löschen?

    Gar nicht, da eine queue das nicht unterstuetzt, hier ein auszug aus der STL
    Dokumentation:

    A queue is an adaptor that provides a restricted subset of Container functionality A queue is a "first in first out" (FIFO) data structure. [1] That is, elements are added to the back of the queue and may be removed from the front; Q.front() is the element that was added to the queue least recently. Queue does not allow iteration through its elements. [2]

    Quelle: http://www.sgi.com/tech/stl/queue.html

    mfg
    v R



  • hi

    hmm sollte eigentlich nicht möglich sein.

    Könntest es natürlich so machen:

    std::queue<int> int_queue; // wir nehmen an hier sind die Daten drin
    
    std::queue<int> tmp_queue; // ist leer
    
    while(!int_queue.empty())
    {
      int tmp_var = int_queue.front();
      tmp_queue.push(tmp_var);
      int_queue.pop();
    }
    

    MfG



  • Wenn man sowas braucht hat man mit Queue höchstwahrscheinlich die falsche Datenstruktur gewählt.



  • cooooser schrieb:

    Wenn man sowas braucht hat man mit Queue höchstwahrscheinlich die falsche Datenstruktur gewählt.

    Ja, irgendwie schon.

    🙄



  • Was würdet ihr empfehlen wenn ich ständig die Liste durchgehen muss um ihre Einträge zu lesen und ab und zu den ersten Eintrag in der Liste löschen muss (FIFO).



  • Nabend,

    ein std::vector<> sollte hier ausreichend sein. Du sagtest, dass du ab und zu
    das erste Element entfernen musst. Fuer solche Zwecke, zum einfuegen und loeschen
    des ersten und letzten Elementes, ist die std::deque<>-Klasse optimiert. Sie
    sollte man aber nur dann einsetzen, wenn man sehr oft das erste oder letzte
    Element loescht oder eins einfuegt. Ansonsten sollte der vector hier voellig
    ausreichend sein (wie bereits gesagt).

    mfg
    v R



  • frager schrieb:

    Was würdet ihr empfehlen wenn ich ständig die Liste durchgehen muss um ihre Einträge zu lesen und ab und zu den ersten Eintrag in der Liste löschen muss (FIFO).

    Wie virtuell Realisticer bereits erwähnt hat wäre std::vector am sinnvollsten.

    // Durchlaufen des vectors:
    std::vector<int> int_vec;
    // erst mal ein paar testwerte einfügen
    int_vec.push_back(1);
    int_vec.push_back(2);
    int_vec.push_back(3);
    int_vec.push_back(4);
    // Hier beginnt das durchlaufen:
    std::vector<int>::iterator start = int_vec.begin();
    std::vector<int>::iterator end   = int_vec.end();
    while(start != end)
    {
      // do foobar with it
      ++start; // nächstes Element
    }
    
    // Löschen des ersten elements:
    
    if(!int_vec.empty())
      int_vec.erase(int_vec.begin());
    

    MfG



  • vector macht nur dann sinn, wenn man ende löschen kann - die struktur also umkehrbar ist. denn vorne löschen ist verdammt lahm -> O(n)

    da doch lieber dann ne liste nehmen... uU reicht ne single linked list?


Anmelden zum Antworten