2017-06-13 30 views
-2

我正在製作大學項目,並且在繼續之前我有一個問題。我必須將一個'dictionary.txt'導入程序,以便它可以更正其他文件的文本。將大文本文件存儲到矢量中並循環播放

現在我的.txt文件是20mb,裏面有200萬字。一旦程序啓動,我就會將它存儲到矢量中。加載所有單詞需要2秒。

我的問題:這是在程序中導入如此多單詞的正確方法嗎?其背後的邏輯是,「散文」中的每一個字都將循環200萬字,直到它被發現和破壞。

在我做到這一點之前,我想知道這是否是一種不好的或好的方法來做到這一點,爲什麼。

+0

不,「矢量」是一個非常糟糕的選擇。您正在尋找['std :: map'](http://en.cppreference.com/w/cpp/container/map)。 –

+1

我想知道'map'如何幫助! – CinCout

+0

@CinCout和'map'不會有線性搜索,而且速度可能會更快。請解釋爲什麼'map'不會幫助。 –

回答

0

如果你只想存儲單詞本身,std :: vector是一個不錯的選擇,但你應該知道發生的重新分配。

如果字典是爲了保持相同的大小,您應該考慮爲矢量保留內存。

基本上你想要做這樣的事情:

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(); 
     } 

與載體的問題是,搜索需要很長的。如果你能確保你的dictionary.txt中的每一個單詞都是唯一的,那麼一組是一個樹形容器,因爲搜索的速度要快得多。

如果您訂購了矢量,您可以提高矢量搜索的性能,但不會達到地圖/集性能附近的任何值。儘管如此,你將不得不準備字典供一套使用。

此外,你可以在較小的子向量中分割字典(一個用於Aa一個用於Bb等)。這可以更好地提高你的表現,因爲你可以從你嘗試糾正的單詞的開頭字母開始。

地圖不適合這種情況,因爲地圖是爲了存儲密鑰和值。關鍵也必須是獨一無二的。好吧,你可以使用你的單詞作爲鍵,只需使用int id作爲值,但你也可以使用一個集合。

整體而言,矢量並不是一個不錯的選擇,對於這種情況,性能應該很好(即使地圖的性能會更好),但是如果您希望獲得最佳性能,那麼設置就是您要找的。

通常,矢量應該是默認容器,如果遇到性能問題,那麼可以考慮使用不同的容器。