在hash_multimap搜索上找不到密钥

时间:2009-12-23 15:48:43

标签: c++ visual-studio hashmap

我在定义我的类时做错了什么导致Microsoft将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中的键&lt;'TimeParameter,Foo'&gt;我不能再使用hash_multimap :: find()来查找任何内容。我做错了什么?

注意:是的,我意识到这是另一个日期时间样式类(我的方块是方形的!)我们必须为每个数据库表的每一行创建一个类作为项目要求。是的,他们确实创建了一个年,日,小时的表,而不是使用完善的DateTime类型列。既然他们付钱给我们,我们就不会争论。

另外,我可以随意竖起来,因为他违反DRY。

更新

将size_t()运算符更改为return 0;并没有解决问题。它仍然找不到任何东西。将运算符更改为始终为true也无法解决问题。必须有一些我在程序中的其他地方没有做的事情才会导致这样的错误。

2 个答案:

答案 0 :(得分:2)

为什么你有两个operator<的实现?保留任何一个。

此外,您可能需要定义一个正确的哈希函数(并另外指定要使用的op<)。

答案 1 :(得分:0)

这是滚动自己的DateTime函数的问题。它不仅是令人作呕的,而且也是不断出现的错误来源。我想责备项目要求,但我真的在开玩笑吧?我没有在少于运营商中检查平等。如此小,如此愚蠢,现在,非常公开。