Container durchsuchen und gleichzeitig löschen



  • Hallo,

    ich möchte die Elemente eines Containers durchsuchen und gleichzeitig auch bestimmte (bzw. im Beispiel unten alle) Elemente löschen.

    Mit einer std::list (siehe //1) scheint mein Ansatz ja auch ganz gut zu funktionieren. Wenn ich den selben Code allerdings mit einer std::deque versuche, gibt es einen Coredump.

    Ich dachte eigentlich immer dass die Container durch die Iteratoren gleich behandelt werden können und das Konstrukt

    std::list<int>::iterator tmp_list_it = list_it++;
    my_list.erase(tmp_list_it);
    

    in einer Schleife zulässig ist. Anscheinend mag das die std::deque nicht so gerne.

    Jetzt meine Frage:
    Ist mein Code a) für die List korrekt und für die Deque falsch (bitte Vorschlag, wie richtig und warum). b) komplett falsch/unzulässig und funktioniert für die List nur zufälligerweise. c) richtig und der Iterator für die Deque anscheinen falsch implementiert.

    Danke schon mal für die Antworten.

    Grüße,
    WissenMachtAh

    #include <iostream>
    #include <list>
    #include <deque>
    
    int main (int args, char **argv)
    {
      // 1
      std::list<int> my_list;
    
      my_list.push_back(1);
      my_list.push_back(2);
      my_list.push_back(3);
    
      std::list<int>::iterator list_it = my_list.begin();
      while (list_it != my_list.end())
      {
        std::list<int>::iterator tmp_list_it = list_it++;
        my_list.erase(tmp_list_it);
        std::cout << "List size = " << my_list.size() << std::endl;
      }
    
      // 2
      std::deque<int> my_deque;
    
      my_deque.push_back(1);
      my_deque.push_back(2);
      my_deque.push_back(3);
    
      std::deque<int>::iterator deque_it = my_deque.begin();
      while (deque_it != my_deque.end())
      {
        std::deque<int>::iterator tmp_deque_it = deque_it++;
        my_deque.erase(tmp_deque_it);
        std::cout << "deque size = " << my_deque.size() << std::endl;
      }
    }
    


  • bei einer deque werden wahrscheinlich beim löschen eines elements alle iteratoren ungültig



  • Richtig wäre:

    my_deque.pop_front();
    


  • ^^ schrieb:

    Richtig wäre:

    my_deque.pop_front();
    

    Leider nicht, da ich ja nicht unbedingt das erste Element löschen will. Wie oben beschrieben ist der Code nur ein Beispiel, es kann also durchaus sein, dass ich nur ein bestimmtes Element an irgendeiner Position des Container löschen möchte. Und ich bin mir darüber bewußt, dass die deque aus Performancegründen nicht unbedingt die erste Wahl dafür ist...

    Gruß, WissenMachtAh.





  • tmp_list_it=my_list.erase(tmp_list_it);


Anmelden zum Antworten