0

我有一个包含很多单词的文件,我正在尝试读取和存储。我正在尝试创建排序地图。

我在程序的开头声明了一个结构,它应该用于存储每个条目的信息。

typedef struct dictionary{ std::string word; unsigned char * hash; char *hex; } a_dictionary;
unordered_map<char * , a_dictionary * > Mymap;

这是我为保存单词而执行的代码,但由于某种原因 myMap 没有正确编写

if (myfile.is_open())
        {
            LARGE_INTEGER freq, before, after;
            QueryPerformanceFrequency(&freq);
            QueryPerformanceCounter(&before);
            while ( myfile.good() )
            {
                getline (myfile,line);

                a_dictionary * dic = new dictionary(); // after each line create
                dic->word = line;


                const char * c= line.c_str();
                sha1::calc(c,line.length(), hash);//encrypts the word

                dic->hash = hash;

                sha1::toHexString(hash,hex_str);//encrypts the word
                dic->hex = hex_str;

                Mymap.insert(std::make_pair(hex_str, dic));
            }
            QueryPerformanceCounter(&after);
            float fElapsed = static_cast<float>(after.QuadPart - before.QuadPart) / freq.QuadPart;
            cout<<"Finished in "<<fElapsed;

我没有得到任何编译错误,当我在 while 循环中输出结构的变量时,它们会出现正常......但我的 unordered_map 永远不会被填充。

4

1 回答 1

0

正如我在上面评论的那样,看起来在循环的每次迭代中都重复使用了相同的哈希hex_str缓冲区,因此您每次都使用相同的键(指针地址被用作键,而不是字符串内容)

在不知道sha1::calcsha1::hash的签名或者你如何声明hashhex_str的情况下,我假设你按原样正确使用它们(我猜它们是 c-arrays并且函数采用指向缓冲区的指针并且不会以空值终止输出),我要做的最小更改如下所示:

定义:

// no typedef necessary for struct in C++
struct dictionary {
    std::string word;
    std::vector<unsigned char> hash;
    // string instead of vector so it's hashable
    std::string hex;
};
std::unordered_map<std::string, dictionary*> Mymap;

执行:

if (myfile.is_open())
{
    LARGE_INTEGER freq, before, after;
    QueryPerformanceFrequency(&freq);
    QueryPerformanceCounter(&before);
    while ( myfile.good() )
    {
        getline (myfile,line);

        dictionary * dic = new dictionary(); // after each line create
        dic->word = line;

        const char * c= line.c_str();

        dic->hash.resize(SIZE_OF_HASH_BUFFER);
        sha1::calc(c, line.length(), &(dic->hash[0]));//encrypts the word

        dic->hex.resize(SIZE_OF_HEX_STR_BUFFER);
        sha1::toHexString(&(dic->hash[0]), &(dic->hex[0]));//encrypts the word

        if(!(Mymap.insert(std::make_pair(dic->hex, dic)).second))
        {
            // handle collision somehow...
        }
    }
    QueryPerformanceCounter(&after);
    float fElapsed = static_cast<float>(after.QuadPart - before.QuadPart) / freq.QuadPart;
    cout<<"Finished in "<<fElapsed;

根据您使用Mymap的方式,您可能希望将字典对象包装在智能指针中,或者只是让它们按值传递......如果没有更多上下文,真的不能说。现在,您肯定需要确保在完成Mymap的内容后释放与每个字典关联的内存......如果这是您真正想要的,而不是使用智能指针自动为您完成,您可以,但是要小心清理。

于 2013-02-27T02:40:14.253 回答