-2

我有这个类如下:

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 编写了这个实现,并在几秒钟内完成。两种语言之间的表现怎么会如此激烈?这是由于地图类在 c++ 和 Java 中实现的方式不同吗?在 Java 中,我使用的是 TreeMap,我也使用了 HashMap,但切换到 TreeMap 因为我想对我的地图进行排序。这是 parseDictionary 函数和 insert 函数的代码。构造函数调用 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));
    }
}

感谢所有的帮助,我很感激!

4

2 回答 2

0

似乎不太可能在 300,000 行时呕吐,但您需要进行算术运算。300,000 行中有多少个“字符串”?假设您的意思可能是“单词”,那可能是大约 500 万个单词。也许每个单词是 8 个字符。疯狂地猜测,这可能是每个地图节点 32 个字节。总计约 160 MB。不是很多。

构造函数参数“n”是干什么用的?您是说在插入字符串之前它就失败了吗?

于 2012-04-22T14:10:28.803 回答
0

所有内存分配都在 map 内处理,因此恕我直言,您不需要分配两次(一次在您的构造函数内(隐式))和另一次 - 在构造函数的主体内。除非地图的生命周期应该大于 nLetterFrequency 对象。

于 2012-04-22T14:33:12.680 回答