unordered_map用法

时间:2012-02-07 11:32:12

标签: c++

class CTime
{
public:    
    CTime(){}

    class valueComp   
    {
    public:
        bool operator()(const tm &A,const tm &B) const {
            if ((A.tm_mday < B.tm_mday) && (A.tm_mon< B.tm_mon)&& (A.tm_year < B.tm_year) &&      
                (A.tm_hour< B.tm_hour)&&   (A.tm_min< B.tm_min) &&  (A.tm_sec< B.tm_sec))

               return true;

           return false;
        }
    };

    time_t  MakeTime(struct tm *trf) {
        if(HashTime.size()>86400)
            HashTime.clear();

        it =HashTime.find(*trf);
        if( it   == HashTime.end())
        {   m_tDateSeconds= mktime (trf);    
            cout<<"mktime calculated"<<endl;    
            HashTime[*trf]= m_tDateSeconds;    
            return m_tDateSeconds;                                                    
        }
       else
       {     cout<<"retrieving from map";
             HashTime.find(*trf) ;
       }}
private:
    std::tr1::unordered_map<struct tm,long int,valueComp> HashTime;
    std::tr1::unordered_map<struct tm,long int,valueComp>::iterator it;
    time_t         m_tDateSeconds;
};

int main()
{return 0;
}

这是我为了检查unordered_map是否适合我而编码的内容?

如果代码中有任何错误,请告诉我,因为我是初学者。

1 个答案:

答案 0 :(得分:0)

unordered_map是一个哈希表,因此除了测试相等性之外,还需要提供哈希函数。标准库将为内置类型和其他一些类似std::string提供哈希函数,unordered_map<std::string,int>用于struct tm,但unordered_map<struct tm,long,myHash,valueComp>不会有一个,所以你必须写一个。这必须作为第三个模板参数提供---相等测试是第四个参数,因此您需要size_t

哈希函数必须是可调用的对象类型,其中函数调用运算符获取键类型的值并返回struct myHash{ size_t operator()(struct tm const&); };

std::map<struct tm,long,compareTm>

使用compareTm(并编写排序比较unordered_map)而不是使用{{1}}并提出一个好的哈希函数可能更容易。