2017-06-13 7 views
-2

Ich mache ein Universitätsprojekt und ich hatte eine Frage, bevor ich fortfahre. Ich muss ein "dictionary.txt" in das Programm importieren, damit es den Text einer anderen Datei korrigieren kann.Speichern einer großen Textdatei in Vektoren und Looping

Im Moment ist meine .txt Datei 20mb mit 2 Millionen Wörtern im Inneren. Ich speichere es in einem Vektor, sobald das Programm startet. Es dauert 2 Sekunden laden alle Wörter in.

Meine Frage: Ist dies der richtige Weg, um so viele Wörter in einem Programm zu importieren? Die Logik dahinter ist, dass jedes Wort aus dem "Essay" über die 2 Millionen Wörter geloopt wird, bis es gefunden und gebrochen wird.

Bevor ich dies möglich mache, würde ich gerne wissen, ob dies ein schlechter oder guter Weg ist und warum.

+0

Nein, 'vector' ist eine sehr schlechte Wahl. Sie suchen nach ['std :: map'] (http://en.cppreference.com/w/cpp/container/map). –

+1

Ich frage mich, wie eine 'map' helfen kann! – CinCout

+0

@CinCout mit einer 'map' wird es keine lineare Suche geben, die wahrscheinlich viel schneller ist. Bitte erklären Sie, warum eine 'Karte' nicht hilft. –

Antwort

0

Wenn Sie nur die Wörter selbst speichern möchten, ist std :: vector eine gute Wahl, aber Sie sollten sich der Neuzuweisung bewusst sein, die stattfindet.

Wenn das Wörterbuch in der gleichen Größe bleiben soll, sollten Sie in Betracht ziehen, Speicher für den Vektor zu reservieren.

im Grunde wollen Sie so etwas wie dies zu tun:

void from_file(std::vector<std::string>& content, std::string pathAndFilename = "") 
     { 
      content.reserve(1000000) //the size your dictionary has in words 

      std::fstream readContent; 

      if (pathAndFilename.empty()) 
      { 
       readContent.open("file.txt", std::ios_base::in); 
      } 
      else 
      { 
       readContent.open(pathAndFilename.c_str(), std::ios_base::in); 
      } 

      std::string currentLine; 
      while (std::getline(readContent, currentLine)) 
      { 
       content.push_back(currentLine); 
      } 

      readContent.flush(); 
      readContent.clear(); 
      readContent.close(); 
     } 

Das Problem mit einem Vektor ist, ist die Suche wirklich lange dauert. Wenn Sie sicherstellen können, dass jedes Wort in Ihrer dictionary.txt eindeutig ist, ist ein Satz die richtige Vorgehensweise, da ein Satz ein Baum-Container ist und die Suche dort viel schneller ist.

Sie können die Leistung der Vektorsuche verbessern, wenn Sie den Vektor bestellen, aber Sie werden nichts in der Nähe der Karten-/Mengenleistung erreichen. Trotzdem müssen Sie das Wörterbuch für die Verwendung mit einem Set vorbereiten.

Außerdem könnte man das Wörterbuch in kleinere Untervektoren aufteilen (eins für Aa eins für Bb etc.). Dies wird Ihre Leistung noch mehr verbessern, da Sie direkt am Anfang des Worts beginnen können, das Sie korrigieren möchten.

Eine Karte ist für diesen Fall nicht geeignet, da eine Karte einen Schlüssel und einen Wert speichern soll. Der Schlüssel muss auch einzigartig sein. Ok, du könntest dein Wort als Schlüssel benutzen und nur eine int ID als Wert verwenden, aber dann kannst du auch ein Set verwenden.

Insgesamt ist ein Vektor keine schlechte Wahl und die Leistung sollte in diesem Fall gut sein (auch wenn die Karte einen besseren Job macht), aber wenn Sie die beste Leistung erzielen möchten, ist Set das, wonach Sie suchen.

Normalerweise sollte ein Vektor der Standardcontainer sein. Wenn Sie Leistungsprobleme haben, können Sie einen anderen Container verwenden.

Verwandte Themen