我在定義導致微軟實現hash_multimap爲「miss」的類時做了一些錯誤。這裏是我的課:在hash_multimap搜索上找不到密鑰
class TimeParameter {
public:
TimeParameter(int _year, int _julianDay, int _hour) : m_Year(_year),
m_JulianDay(_julianDay),
m_Hour(_hour){}
int GetHour() const {return m_Hour;}
int GetJulianDay() const {return m_JulianDay;}
int GetYear() const {return m_Year;}
bool operator==(const TimeParameter &_rhs);
bool operator < (const TimeParameter &_rhs);
operator size_t() const;
friend bool operator<(const TimeParameter &_lhs, const TimeParameter &_rhs);
private:
int m_Hour,
m_JulianDay,
m_Year;
};
與CPP文件
TimeParameter::operator size_t() const
{
return (size_t)(8765u * (m_Year % 6)) + (size_t)(m_JulianDay*24u) + (size_t)m_Hour;
}
bool operator<(const TimeParameter &_lhs, const TimeParameter &_rhs)
{
if(_lhs.GetYear() > _rhs.GetYear())
{
return false;
}
else if(_lhs.GetYear() == _rhs.GetYear()
&& _lhs.GetJulianDay() > _rhs.GetJulianDay())
{
return false;
}
else if(_lhs.GetYear() == _rhs.GetYear()
&& _lhs.GetJulianDay() == _rhs.GetJulianDay()
&& _lhs.GetHour() > _rhs.GetHour())
{
return false;
}
return true;
}
bool TimeParameter::operator==(const TimeParameter &_rhs)
{
return m_Hour == _rhs.GetHour()
&& m_JulianDay == _rhs.GetJulianDay()
&& m_Year == _rhs.GetYear();
}
bool TimeParameter::operator <(const TimeParameter &_rhs)
{
if(m_Year > _rhs.GetYear())
{
return false;
}
else if(m_Year == _rhs.GetYear()
&& m_JulianDay > _rhs.GetJulianDay())
{
return false;
}
else if(m_Year == _rhs.GetYear()
&& m_JulianDay == _rhs.GetJulianDay()
&& m_Hour > _rhs.GetHour())
{
return false;
}
return true;
}
如果我再使用這個類作爲一個hash_multimap <的關鍵「TimeParameter,富」>我無法再使用hash_multimap :: find()找到任何東西。我做錯了什麼?
注意:是的,我意識到這是另一個日期時間樣式類(我的輪子是方形的!)我們必須爲每個數據庫表的每一行創建一個類作爲項目需求。是的,他們真的只是創建一個表,而不是使用良好建立的DateTime類型列來創建一年,一天,一小時的表格。既然他們付錢給我們,我們就不爭論。
此外,隨時豎琴我違反DRY。
更新:
中的size_t()操作更改爲return 0;
沒有解決的問題。它仍然找不到任何東西。改變運營商以始終產生真實也沒有解決問題。在程序中的其他地方一定有一些我沒有做的事情導致這樣的錯誤。
我原本只有<(const TimeParameter),但它抱怨我缺少第二個。當我把它改爲第二個時,我抱怨說我缺少第一個。因此,雙方都在。至於哈希,我想我會玩一下,看看這是不是罪魁禍首。你是絕對正確的,我需要一個真正的散列函數。 +1給你,先生。 – wheaties 2009-12-23 16:24:50