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是否适合我而编码的内容?
如果代码中有任何错误,请告诉我,因为我是初学者。
答案 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}}并提出一个好的哈希函数可能更容易。