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 Falldelete[] TVokabelListe;delete ohne "[]" ist dabei ganz böse.
-
Caribbean Blue schrieb:
Aber nicht das delete[] vergessen.
In diesem Falldelete[] 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.