Man kann einen Iterator in einer anderen list benutzen



  • Guckt mal Leute was funktioniert. 😡

    #include <list>
    #include <iostream>
    
    int main()
    {
    	std::list<int> zahlen1;
    	zahlen1.push_back(1);
    	zahlen1.push_back(2);
    	zahlen1.push_back(3);
    
    	std::list<int> zahlen2;
    	zahlen2.push_back(4);
    	zahlen2.push_back(5);
    	zahlen2.push_back(6);
    
    	zahlen2.erase(zahlen1.begin()); // Iterator aus zahlen1 in zahlen2 benutzen
    
    	std::list<int>::iterator i = zahlen1.begin();
    	for(; i != zahlen1.end(); ++i)
    	{
    		std::cout << *i << std::endl;
    	}
    }
    

    Und die Ausgabe ist 2 und 3.
    Warum wird sowas erfolgreich durchgeführt? 🤡



  • Naja wär ja aber auch irgendwie aufwendig, wenn jedes Mal überprüft
    wird ob der Iterator tatsächlich auf ein Element des eigenen Containers
    verweist.



  • Ein Listelement kann sich selbst aus eine List entfernen. Damit
    ist es unerheblich welcher List-Container dies ausführt.
    Das einzige ist, das die Typen stimmen müssen.

    Es gibt so Funktion wie splice, merge, elemiere wenn

    da ist es sehr hilfreich, das List-Container gleichen Typs auf einer List agieren könnten.



  • idefix schrieb:

    Ein Listelement kann sich selbst aus eine List entfernen. Damit
    ist es unerheblich welcher List-Container dies ausführt.
    Das einzige ist, das die Typen stimmen müssen.

    Ist das wirklich legal im C++ Standard??



  • std::cpp schrieb:

    Ist das wirklich legal im C++ Standard??

    Natürlich nicht. Das verhalten des Programms ist undefiniert.
    Und das bedeutet, dass das verhalten total legal ist.

    Deshalb sollte man eine STL mit DebugModus verwenden wie zB STLPort - dort müßte soetwas theoretisch einen Fehler geben (allerdings bin ich noch nie auf solche kranken ideen gekommen, deshalb kann ich das nicht mit bestimmtheit sagen)


Anmelden zum Antworten