0

カタロニア語にいくつかの単語が存在するかどうかをチェックする C++ プログラムを書いているので、カタロニア語辞書を含むベクトルがあります。

const vector<string> dict={"aaron","ababol","abac","abaca","abacallanada","abacallanava","abacas","abacial", ... ,"zum-zum","zur","zuric","zwitterio"};

問題は、辞書に 107776 のエントリがあるため、ファイルをコンパイルしようとすると:

g++ -Wall file.cc -std=c++0x -o file.exe

しばらく何もしないと、Windows は応答していないと言って閉じます。

どうすればコンパイルできますか?このタイプのデータ (配列など) を保存するより良い方法はありますか?

4

4 に答える 4

4

古い学校の組み込み配列を使用すると、もっとうまくいくかもしれません。

char const * const dict[] = {"aaron",...};

これにより、文字列リテラルの負荷とそれらへのポインターの配列が生成されますが、コンパイラーにとってはそれほど負担にはなりません。これはまた、必要以上のメモリを使用せず、実行時の作業はほとんどまたはまったくありません。

あるいは、std::array<char const *>より C++ のルック アンド フィールを使用して、同様に効率的である必要があります。

initializer_listあなたのバージョンはまた、それらから を構築し、それぞれから文字列を構築し、各文字列をベクトルに追加するために、膨大な量のコードを生成する必要があります。また、各文字列リテラルを実行時に割り当てられたメモリにコピーする必要があるため、2 倍以上のメモリが必要になります。その後、これらすべてのポインタを別の実行時に割り当てられた配列に格納する必要があります。

欠点は、辞書から読み取るたびに一時的な文字列を作成することになる可能性があることです。それが懸念される場合は、 の配列がstd::string妥当な妥協点になる可能性があります。

于 2012-07-17T22:50:52.037 に答える
3

外部ファイルに保存し、オンデマンドでロードします。これが最善の解決策です。それ以外の場合は、ベクターを複数のベクターに分割し、別の cpp ファイルに入れる必要があると思います。

于 2012-07-17T22:30:24.027 に答える
0

他の回答のメソッドを使用して、ファイルから辞書の単一セットのみをロードすることは可能でしょうか。つまり、 file から「a」単語のみをロードしますa.dic。それとも、一度に辞書全体にアクセスする必要がありますか?

于 2012-07-17T22:44:11.573 に答える
0

辞書をテキスト ファイルに 1 行に 1 語ずつ保存します。次に、このコードをプログラムに追加します。

{ 
  std::string inputFileName;
  std::ifstream inputFile(inputFileName);
  std::string word;
  while( std::getline(inputFile, word) )
    dict.push_back(word);
}
于 2012-07-17T22:31:28.323 に答える