2017-06-13 6 views
-2

私は大学のプロジェクトを作っていますが、先に進む前に質問がありました。 'dictionary.txt'をプログラムにインポートして、他のファイルのテキストを修正できるようにする必要があります。大きなテキストファイルをベクターに保存してループする

現在、私の.txtファイルのサイズは20万バイトで、内部に200万語を含んでいます。私はプログラムが始まるとすぐにベクトルに格納しています。

私の質問:これは、プログラム内で非常に多くの単語をインポートする正しい方法ですか?その背後にある論理は、「エッセイ」のすべての単語が見つかって壊れるまで、200万語以上のループが繰り返されることです。

私がこれを可能にする前に、これを行うのが悪い、または良い方法であるかどうかを知りたいと思います。

+0

いいえ、「ベクトル」は非常に悪い選択です。あなたは['std :: map'](http://en.cppreference.com/w/cpp/container/map)を探しています。 –

+1

'map'がどのように役立つのでしょうか? – CinCout

+0

@CinCoutを '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内のすべての単語がユニークであることを保証できるならば、セットがツリーコンテナであり、そこを検索する方がずっと速いので、セットは行く方法です。

ベクターを注文するとマップ検索のパフォーマンスを向上させることができますが、マップ/セットの近くでは検索できません。それにもかかわらず、セットで使用するための辞書を準備する必要があります。

さらに、小さなサブベクトル(1つはAb、Bbなど)で辞書を分割できます。これは、あなたが修正しようとしている単語の最初の文字からすぐに始めることができるので、あなたのパフォーマンスをさらに向上させます。

マップはキーと値を格納するため、マップはこのケースには適していません。鍵はユニークでなければなりません。あなたはキーとしてあなたの言葉を使用することができ、ちょうど値としてint idを使用しますが、同様にセットを使用することができます。

全体的に1つのベクトルは悪い選択ではなく、この場合はパフォーマンスが良いはずですが(マップがうまくいく場合でも)、最高のパフォーマンスを達成したい場合は、探しているものを設定します。

通常、ベクターはデフォルトのコンテナにする必要があります。パフォーマンスの問題が発生した場合は、別のコンテナを使用することを検討できます。

関連する問題