std::list.sort() löscht einfach Elemente -> dringend



  • Hallo!

    Ich lese strings ein und speicher sie in einer Liste, nach dem einlesen hat die Liste eine Größe von 265424 Elementen. Danach wird direkt liste.sort() aufgerufen, da viele Elemente doppelt vorkommen, nach dem sortieren bleiben nur noch 3280 sortierte Elemente übrig?! Danach rufe ich liste.unique() auf was ja dann eigentlich erst die doppelten Elemente löschen sollte -> es bleiben 104 verschiedene Elemente übrig, leider fehlen jetzt welche, nämlich die die bei Sort gelöscht wurden 😕 😕 Woran kann das liegen?

    Ich bastel jetzt schnell noch etwas zusammen was ihr dann compilieren könnt damit ihr seht was ich meine.



  • Klasse, Lycos leitet mich nicht mehr auf meine Homepage sondern auf die Lycos.de Seite. Wenn jemand ca. 400 kb an Webspace hat wäre ich sehr dankbar, dann könntet ihr das textfile + die exe herunterladen. Hier ist der Source:

    #include <list>
    #include <string>
    #include <fstream>
    #include <iostream>
    using namespace std;
    
    void Read()
    {
    	ifstream     in("ursprung.txt");
    	list<string> List;
    	ofstream Log("danach.txt", ios::app);
    
    	// Werte einlesen
    	Log<<"Schritt 1 nach dem Auslesen:"<<endl<<endl;
    
    	for(string line; getline(in, line);)
    	{
    		Log<<line<<endl;
    		List.push_back(line); 
    	}
    	Log<<"Groesse der Liste: "<<List.size()<<endl;
    
    	// Sortieren
    	List.sort();
    	Log<<endl<<endl<<endl<<endl<<endl<<"Schritt 2 nach dem Sortieren:"<<endl<<endl;
    	Log<<"Groesse der Liste: "<<List.size()<<endl;
    
    	for(list<string>::iterator it1 = List.begin(); it1 != List.end(); ++it1)
    		Log<<(*it1)<<endl;
    
    	// Doppelte Elemente löschen
    	List.unique();
    	Log<<endl<<endl<<endl<<endl<<endl<<"Schritt 3 Nach dem entfernen der doppelten Elemente:"<<endl<<endl;
    	Log<<"Groesse der Liste: "<<List.size()<<endl;
    
    	for(list<string>::iterator it2 = List.begin(); it2 != List.end(); ++it2)
    		Log<<(*it2)<<endl;
    
    }
    
    int main()
    {
    	Read();
    
    	return(0);
    }
    

    Ausgabe:

    **
    Schritt 1 nach dem Auslesen:
    Groesse der Liste: 265424

    Schritt 2 nach dem Sortieren:
    Groesse der Liste: 3280

    Schritt 3 Nach dem entfernen der doppelten Elemente:
    Groesse der Liste: 104
    **

    Ist da mein Fehler offentsichtlich? Oder liegt es am Ende doch gar an der std::list 😕



  • Ich hab das ganze jetzt umgestellt und es funktioniert, aber wenn jemand weiß wieso das vorher nicht ging unbedingt melden:

    Alt

    for(string line; getline(in, line);)
            List.push_back(line);
    
    List.sort();
    
    List.unique();
    

    Neu

    for(string line; getline(in, line);)
    {
            List.push_back(line);
    
            List.sort();
    
            List.unique(); 
    }
    

    Kostet zwar viel mehr Funktionsaufrufe aber es geht wenigstens.



  • Ich kann das hier nicht reproduzieren. Bist du sicher, dass du die richtigen Ausgabetexte liest? Immerhin hängst du ja immer hinten an.



  • MFK schrieb:

    Ich kann das hier nicht reproduzieren. Bist du sicher, dass du die richtigen Ausgabetexte liest? Immerhin hängst du ja immer hinten an.

    Ja ich bin mir zu 100% sicher!

    Ich würde euch gerne die zipdatei mit code, textfile und exe hochladen habe aber keinen Platz.

    Beim sort gehen Einträge verloren.



  • Hast du ICQ? 138448661



  • Deine Exe zeigt bei mir das fehlerhafte Verhalten.
    Dein Code, bei mir kompiliert, funktioniert.

    Das kommt bei mir raus (MSVC.NET 2003):

    Schritt 1 nach dem Auslesen:
    Groesse der Liste: 265424

    Schritt 2 nach dem Sortieren:
    Groesse der Liste: 265424

    Schritt 3 Nach dem entfernen der doppelten Elemente:
    Groesse der Liste: 142



  • Und genau das hab ich über meinen Umweg auch rausbekommen, "Groesse der Liste: 142" ist richtig. Ich benutze das 6er Visual Studio, schon merkwürdig wieso meine STL einen Fehler hat... Aber gut, ok 😕



  • Nimm doch einen vector und std::sort.



  • Dafür ist das Projekt zu fortgeschritten, bzw. ich glaube das die liste in dem Projekt sinniger ist. Aber das konntest du ja nicht wissen da ich ja nur einen Aussschnitt gepostet hatte.







  • Klasse, danke Leute!


Anmelden zum Antworten