1

C++ でいくつかのコードを単純化する方法について質問を受けました。

そのため、CS コースでこのラボが与えられ、入力ファイルに基づいて大きな文を生成し、読み取った行を文字列のリストのリストのマップに格納する必要があります (うわー!)。再帰関数を使用して検索する必要があります。

したがって、マップ キーは文字列です。最初のリストは行のコレクションで、2 番目のリストはファイルから解析された文字列のコレクションです。

map<string, list<list<string> > >

文字列のリストを 1 つの文字列に再構築する必要があります。いくつかのイテレータを設定しましたが、イテレータの宣言に到達すると「セグメンテーション違反 11」が発生します。

「文法」は、すでに入力が与えられ、参照によって渡されるマップです。

「不完全」は、関数に渡されるキーと等しい文字列です。

コードスニペット:

string found = "";
map<string, list<list<string> > >::iterator section = grammar.find(incomplete);
list<list<string> > listItem = section->second;
list<list<string> >::iterator lIt = listItem.begin();
srand(time(NULL));
++lIt;
advance (lIt, rand() % listItem.size());
list<string> stringItem = *lIt;
while (stringItem.empty() == false){
    found = found + " " + stringItem.front();
    stringItem.pop_front();
}

rand() の必要性を説明するには: 最初のリストには複数のリストがあり、文を生成するためにランダムに 1 つを選択します。私はそれを正しく使用しましたか?

このあたりで止まります。そのリストにたどり着くもっと簡単な方法があると確信していますが、それを理解できないようです.「セグメンテーションフォールト11の場合、これらすべてを宣言するために多くのメモリを消費していると思います. 」が投げられています。助言がありますか?

4

1 に答える 1

0

さらに問題があるかもしれませんが、ここに2つの明らかな問題があります。

  1. grammar.find(incomplete);実際に要素が見つかったかどうかはチェックしません。検索が失敗した場合、検索は戻りgrammar.end()、残りの部分は爆発する可能性があります。

  2. ランダムな要素を見つけようとする方法に問題があります。

list<list<string> >::iterator lIt = listItem.begin();

*lItの最初のリストになりましたlistItem

++lIt;

*lItはの2番目のリストになりましたlistItem

advance (lIt, rand() % listItem.size());

これにより、イテレータを進めすぎてしまう可能性があります。リストのサイズが大きい場合はn、ほとんどのステップを進めることができn-2ます。そうでない場合は、終わりを超えています。しかし、rand() % nすることができますn-1

于 2013-02-07T19:15:17.940 に答える