014
31.01.2007, 20:15 Uhr
0xdeadbeef
Gott (Operator)
|
Ich würd an der Stelle ganz ernsthaft ne Datenbank empfehlen, die macht genau das und ist im Zweifel besser optimiert, als alles, was du so schreiben kannst. Ansonsten, ne std::map implementiert in aller Regel einen Rot-Schwarz-Baum, garantiert ist logarithmische Skalierung so ziemlich aller Operationen mit der Anzahl der Einträge.
Prinzipiell gibt es eine Reihe von Möglichkeiten, das ganze zu verarbeiten. Da die Schlüssel eine Ordnung haben - lexikographischen Vergleich - musst du auf jeden Fall nicht mit allen Namen vergleichen, die du wissen willst, sofern du diese vorher in einem Baum speicherst - da bietet sich z.B. std::set an. Denkbar wäre auch, schon eingelesene Namen (sofern die Einträge eindeutig sind) nach Einlesen aus diesem set zu löschen, dann hast du später weniger zu vergleichen. Ich stell mir das etwa so vor:
C++: |
#include <fstream> #include <iostream> #include <map> #include <pair> #include <set> #include <sstream> #include <string>
int main() { std::ifstream valid_keys_in("valid_keys.txt"); std::ifstream db_in("db.txt");
std::set<std::string> valid_keys; std::map<std::string, std::pair<std::string, std::string> > grepped_db; std::string line, key, str, job; std::istringstream isstr;
while(valid_keys_in >> key) valid_keys.insert(key);
while(std::getline(db_in, line)) { isstr.clear(); isstr.str(line); isstr >> key >> str >> job; if(isstr) { std::set<std::string>::iterator i = valid_keys.find(key); if(i != valid_keys.end()) { grepped_db[key] = std::pair<std::string, std::string>(str, job); valid_keys.erase(i); } } } }
|
Ansonsten, wenn du vorher weißt, wie groß das Ding ungefähr wird und du die SGI-Erweiterungen der stdlib benutzen kannst, empfiehlt sich u.U. ne hash_map. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 31.01.2007 um 20:16 Uhr von 0xdeadbeef editiert. |