私は次のようにこのクラスを持っています:
class nLetterFrequency
{
private:
map<string, int> frequencyTable;
void insert(const string& letterPerm);
void parseFile(int n); //calls insert()
public:
nLetterFrequency(int n); //calls parseFile()
~nLetterFrequency();
};
どうやら私のコードに問題はないようです。完了するまでに 2 ~ 3 分しかかからないことがわかりました (それは奇妙ではありませんか?)。私は最初にこの実装を Java でコーディングし、数秒で終了したため、これは怪しいように思えます。2 つの言語間のパフォーマンスが劇的に向上するのはなぜでしょうか? これは、c++ と Java でのマップ クラスの実装方法の違いによるものですか? Java では TreeMap を使用しています。HashMap も使用しましたが、マップを並べ替えたかったので TreeMap に切り替えました。parseDictionary 関数と挿入関数のコードを次に示します。コンストラクターは parseDictionary() を呼び出し、それだけです。
void nLetterFrequency::parseDictionary(int n)
{
ifstream infile("3dictionary.txt"); //length of words >= 3
while(!infile.eof()) //while we are not at the end of the file
{
string word;
getline(infile, word);
if(word.length() < n)
{
printf("Error: check the dictionary file since word.length() < n\n");
exit(0); //quit the program
}
for(int i = 0; i < word.length() - n + 1; i++)
{
string perm("");
for(int j = 0; j < n; j++)
{
perm += word[i+j];
}
insert(perm);
}
}
infile.close();
}
void nLetterFrequency::insert(const string& letterPerm)
{
if(frequencyTable.count(letterPerm)) //letterPerm is already in frequencyTable
{
frequencyTable.find(letterPerm)->second++; //increment the current frequency of entry letterPerm
}
else //insert the new permutation into frequencyTable
{
frequencyTable.insert(pair<string, int>(letterPerm, 1));
}
}
すべての助けをありがとう、私はそれを感謝します!