Dubletten löschen



  • zeilenweise einlesen, links und rechts trimmen
    in einem set std::string einfügen und danach
    eintrag für eintrag speichern.

    (Einträge in einen Set sind immer eindeutig,
    Sortierung erfolgt über Operatoren von std::string)



  • Hallo,

    was mache ich falsch, ich kann kein set erstellen.
    Es kommt der Fehler ... 'set' : undeclared identifier

    Ausserdem kommt bei "while(getline(fin,zeile)" ebenfalls ein Fehler. Ich kann es nur über fin.getline ansprechen...Irgendwas stimmt hier doch an meinen compilereinstellungen noch nicht!

    DANKE!!!



  • polocpp schrieb:

    Hallo,

    was mache ich falsch, ich kann kein set erstellen.
    Es kommt der Fehler ... 'set' : undeclared identifier

    #include <set>
    #include <string>
    #include <fstream>
    using namespace std;
    


  • #include <set> //dort steht die set drin
    #include <string> //für die getline()
    using namespace std;
    

    ^^ das gehört an den Anfang deiner CPP



  • AHA!

    Das
    #include <set>
    hat mir noc hgefehlt.

    Jetzt klappt ja fast, nur warum kommt bei
    gefunden.insert(zeile);
    ein Fehler (es werden 3 Parameter benötigt??)

    DANKE!!



  • Keine Ahnung - normalerweise müsste der Compiler dort die 1-Parameter-Version "set<T>::insert(const T& val);" verwenden.



  • Hallo,

    ich verzweifle mit meinem c++ compiler (MS Visual C++ 6.0)...

    Ich habe nun folgendes Programm:

    #include <set> 
    #include <string> 
    #include <fstream> 
    using namespace std; 
    
    int main()
    {
    
    set<string> gefunden; 
    string zeile; 
    ifstream fin("In.txt");ofstream fout("Out.txt"); 
    while(getline(fin,zeile)) 
    { 
      if(gefunden.find(zeile)) continue; 
      fout<<zeile<<endl; 
      gefunden.insert(zeile); 
    } 
    
     return 0;
    }
    

    Und dann bekomme ich folgenden Fehler:
    h:\2005\settest\settest.cpp(17) : error C2451: conditional expression of type 'class std::_Tree<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class

    und dazu noch 6 warnings "warning C4786: 'std::_Tree<std::basic_string<char,std::char_traits<char>...."

    WAS LÄUFT DENN HIER FALSCH??? 😡



  • CStoll (off) schrieb:

    if(gefunden.find(zeile))continue;
    

    vielleicht beschwert er sich über diese zeile?

    if (gefunden.find(zeile) != gefunden.end()) continue;
    


  • GENAU !! DANKE!!

    jetzt bekomme ich keinen Fehler mehr, und das Programm funktioniert wie gewünscht!

    NUR: ich bekomme noch 100 warnings (in dem kleinen Programm!!)
    Ich habe in http://support.microsoft.com/default.aspx?scid=kb;en-us;167355 gefunden das dies ein bekannter Bug von MS Visual C++ 6.0 ist! KANN DAS SEIN? WIE KANN ICH DIE MELDUNGEN DEAKTIVIEREN. Das nervt!

    DANKE!!!!



  • Hallo,

    jetzt habe ich doch noch ein anderes Problem.
    Ich sollte auch noch die Anzahl der Dubletten ermitteln! Geht das so auf diese Weise überhaupt??

    DANKE



  • Hallo,

    jetzt habe ich doch noch ein anderes Problem.
    Ich sollte auch noch die Anzahl der Dubletten ermitteln! Geht das so auf diese Weise überhaupt??

    DANKE



  • Das Problem habe ich jetzt selber hinbekommen:

    while(getline(fin,zeile)) 
    	{ 
    	         i++;
    		if (gefunden.find(zeile) != gefunden.end())	continue;
    		ineu++;
    		fout<<zeile<<endl; 
    		gefunden.insert(zeile);	
    	} 
    
    	dubeletten = i - ineu;
    


  • mit set gehts auch eleganter
    set::insert gibt dir ein std::pair<iterator,bool> zurück.

    while(getline(fin,zeile)) { 
        if ( gefunden.insert(zeile).second ) {
            ineu++;
            fout<<zeile<<endl; 
        } 
        i++;
    }
    dubeletten = i - ineu;
    

    Kurt


Anmelden zum Antworten