2009-12-23 42 views
1

我在定義導致微軟實現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;沒有解決的問題。它仍然找不到任何東西。改變運營商以​​始終產生真實也沒有解決問題。在程序中的其他地方一定有一些我沒有做的事情導致這樣的錯誤。

回答

0

這是滾動自己的DateTime函數的問題。它不僅被做成了惡作劇,而且也是一個不斷的錯誤來源。我想責怪項目的要求,但我真的在開玩笑嗎?我沒有在小於運營商的情況下檢查平等。如此小,如此愚蠢,現在,非常公開。

2

爲什麼你有兩個operator<的實現?保留任何一個。另外,你可能需要定義一個合適的散列函數(並且另外指定要使用哪一個op<)。

+0

我原本只有<(const TimeParameter),但它抱怨我缺少第二個。當我把它改爲第二個時,我抱怨說我缺少第一個。因此,雙方都在。至於哈希,我想我會玩一下,看看這是不是罪魁禍首。你是絕對正確的,我需要一個真正的散列函數。 +1給你,先生。 – wheaties 2009-12-23 16:24:50