Welcher STL Container?
-
Hallo,
ich schreibe gerade ein Programm, das Daten aus einer Database ausliest. Dazu habe ich eine Klasse erstellt, deren Objekte die Daten der Database repräsentieren, und den >> Operator zum einlesen überladen.//Ausschnitt aus der Klasse class Information { public: std::string name; std::multmimap<int, int> Eigenschaft2; };Nehmen wir an, die Daten in der Database hätten folgende Aufteilung: Ein name, einen int-Wert für das Jahr und einen int-wert für den Monat, in dem sie eingetgragen wurden. Da die beiden int-werte ein Paar bilden und zusammen gehören, habe ich sie in eine multimap gesteckt.
Eingelesen werden die Daten in einen std::vector<Information> vec;Dabei ergibt sich das eigentliche Problem:
Jedes objekt soll nur einmal im vector vorkommen. Daher würde sich ja eigentlich eine std::map anbieten (zB std::map<name, Eigenschaft2>). Allerdings brauche ich sehr oft random acces (also Elemente über rand() zugreifen), weshalb eine std::map nicht (performant) funktioniert. Mein aktueller Algorithmus beim Einlesen der Daten sieht so aus:std::ifstream lesen(name, std::ios::in); bool gefunden(false); while(!lesen.eof()) { Information info; lesen>>info; for(size_t h(0);h!=vec.size();++h) { if(karte.name == vec[h].name) { std::multimap<std::string, char>::const_iterator it = info.Eigenschaft2.begin(); vec[h].Eigenschaft2.insert(make_pair( (*it).first, (*it).second) ); gefunden=true; break; } } if(gefunden) { gefunden=false; continue; } vec.push_back(info); }Dabei kann man sich leicht vorstellen, dass dieser Teil exponentiell viel Zeit verschlingt, da nach jeder neuen Info der komplette vector durchsucht werden muss und bei jeder neuen Info wächst.
for(size_t h(0);h!=vec.size();++h) { if(karte.name == vec[h].name) { //... } } vec.push_back(info);Hat jemand eine alternative Idee, Daten in einen Container einzulesen, der permormant random access unterstützt, wobei jedes element nur einmal vorkommt?
Schonmal Danke für Anregungen!
-
STLFan schrieb:
Allerdings brauche ich sehr oft random acces (also Elemente über rand() zugreifen), weshalb eine std::map nicht (performant) funktioniert.
Was soll random zugriff bedeuten? Du kannst auch mehrere maps haben.
-
Hash-Map hat einen wunderbar O(1) RA-Zugriff.
MfG SideWinder
-
Was soll random zugriff bedeuten?
Das bedeutet, das ich aus dem vector, der sämtliche Elemente enthält, zufällig Elemente aussuche und in einen neuen vector packe, zB:
std::vector<Information) neuer_vector; neuer_vector.push_back( rand() % vec.size() );Und solche Aktionen werden recht häufig durchgeführt
Hash-Map hat einen wunderbar O(1) RA-Zugriff.
Was ist eine Hash-map?

-
STLFAN schrieb:
Was soll random zugriff bedeuten?
Das bedeutet, das ich aus dem vector, der sämtliche Elemente enthält, zufällig Elemente aussuche und in einen neuen vector packe, zB:
std::vector<Information) neuer_vector; neuer_vector.push_back( rand() % vec.size() );Und solche Aktionen werden recht häufig durchgeführt
Was soll das bringen? Suchst du random shuffle?
Hash-Map hat einen wunderbar O(1) RA-Zugriff.
Was ist eine Hash-map?
