Dynamische Strukturen Array



  • Ich würd Dir wirklich eine map empfehlen, erspart ne Menge Arbeit, und wieso immer das Rad neu erfinden.



  • Aber nicht das delete[] vergessen.
    In diesem Fall

    delete[] TVokabelListe;
    

    delete ohne "[]" ist dabei ganz böse.



  • Caribbean Blue schrieb:

    Aber nicht das delete[] vergessen.
    In diesem Fall

    delete[] TVokabelListe;
    

    delete ohne "[]" ist dabei ganz böse.

    delete [] mit TVokabelListe ist auch ganz böse. Lieber:

    delete [] myVokabel;
    

    grüße



  • THX 1138 schrieb:

    Ich würd Dir wirklich eine map empfehlen, erspart ne Menge Arbeit, und wieso immer das Rad neu erfinden.

    jetzt wollte ich mich an maps wagen aber scheitere schon am inster:

    map<int, string, string> myVokabelMap;
    
       while ( ! myFile.eof() ) {
           getline(myFile, sLine);
           string::size_type pos = sLine.find(":");
           ++i;
           myVokabelMap.insert( i, sLine.substr(0,pos-1), sLine.substr(pos+1,sLine.length()) );
       }
    

    was mache ich den da so falsch



  • Eine map<> verwendet nur zwei Template-Parameter (OK, eigentlich vier - aber die letzten Parameter sind die Vergleichsfunktion und der Allokator), also dürfte schon dein "map<int,string,string>" nicht funktionieren. Zur Lösung könntest du den ID-Teil weglassen:

    map<string, string> myVokabelMap;
    
    while ( ! myFile.eof() ) {
      getline(myFile, sLine);
      string::size_type pos = sLine.find(":");
      myVokabelMap.insert( std::make_pair(sLine.substr(0,pos-1), sLine.substr(pos+1,sLine.length())) );
    }
    

    (btw, wenn der selbe Begriff mehrfach in deiner Vokalliste vorkommen kann - nimm besser eine multimap<>)

    PS: "klappt nicht" ist nur in wenigen Fällen hilfreich - meistens bringt es etwas, die Fehlermeldungen des Compilers mitzuliefern.



  • while ( ! myFile.eof() )
    

    Puhuuh. Gefääährlich. Pöse. Was is mit bad-bit und fail-bit? Besser:

    while(myFile.good())
    


  • Danke CStoll und Plotzenhotz

    Was ich nicht versteh ist das hier. Ich fülle meine mal mir ca. 80 einträgen und
    wenn ich dann ein "test = myVokabelMap.size();" mache steht da nur 2 drin!? Wieso?

    typedef map<string, string> Vokabelen;
    
       Vokabelen myVokabelMap;
    
       while ( ! myFile.eof() ) {
           getline(myFile, sLine);
           string::size_type pos = sLine.find(":");
           myVokabelMap.insert( make_pair(sLine.substr(0,pos-1), sLine.substr(pos+1,sLine.length())) );
       }
       int test;
       test = myVokabelMap.size();
    

    gruß und dank

    zyon



  • Füge vor dem myVokabelMap.insert(...) folgendes ein:

    std::cout << "[" << sLine.substr(0,pos-1) << "]" << std::endl << std::flush;
    

    Dann siehst du welche Keys du verwendest - werden wohl nur 2 verschiedene sein, daher auch nicht mehr als 2 Einträge in der map.

    Und lass das greisliche "using namespace std;" weg, das ist IMHO ganz schlechter Stil 🙂



  • Und wie ich schon sagte - wenn die selbe Vokabel mehrfach vorkommen kann, nimm eine multimap anstelle der map (damit kann man fast genauso umgehen).

    PS:

    Plotzenhotz schrieb:

    Füge vor dem myVokabelMap.insert(...) folgendes ein:

    std::cout << "[" << sLine.substr(0,pos-1) << "]" << std::endl << std::flush;
    

    Das flush an dieser Stelle ist aber unnötig (endl flush't den Stream auch von sich aus).



  • Danke für eure tipps es geht jetzt alles wunderbar. doch leider habe ich eingesehen das map wohl doch nicht der
    richtige type für mich ist. Ich wollte nach den füllen der map schauen wieviel EInträge vorhanden sind und
    dann eine Zufalls zahl machen und nach dieser. z.b auf den 3 EIntrag zugreifen. diesen würde mir ja nur gelingen
    hatte ich eine ID oder ich würde ich schleife bis zu der Postion machne (schlecht idee den bei z.b dem 1000000 EIntrag)
    wird das ganze sehr langsam. Mit find() kann ich ja nur nach dem key suchen...

    jemand ne idee für einen anderen Typen?

    gruß

    zyon



  • Hi,

    wie wär's mit

    vector<pair<string, string> >
    

    ?
    Dann kannst Du das Teil per "Index" zugreifen (auch ziemlich schnell) ..

    Gruß,

    Simon2.


Anmelden zum Antworten