为什么QMultiMap的查找操作不能像我预期的那样工作?

时间:2012-03-06 11:42:40

标签: c++ qt

我有一个QMultiMap<QDateTime, SomeOwnDataType>,我想从中检索具有特定时间戳的所有值。这就是我的工作:

QMap<QDateTime, Appointment>::iterator it = _reminders.find(now);

其中now的值为 di 6. mrt 12:07:00 2012 。这是我的循环条件:

while (it != _reminders.end() && it.key() == now) {

这是_reminders对象的状态:

Debug

与我的期望相反,循环被完全跳过。怎么样?

2 个答案:

答案 0 :(得分:4)

我认为问题在于两个时间戳不相等。如果您检查==运算符代码QDateTime,如果时间和日期相等,您将看到相等。

bool QDateTime::operator==(const QDateTime &other) const
{
    if (d->spec == other.d->spec && d->utcOffset == other.d->utcOffset)
        return d->time == other.d->time && d->date == other.d->date;
    else {
        QDate date1, date2;
        QTime time1, time2;

        d->getUTC(date1, time1);
        other.d->getUTC(date2, time2);
        return time1 == time2 && date1 == date2;
    }
}

但时间相等的算子比较毫秒:

bool operator==(const QTime &other) const { return mds == other.mds; }

其中mds是以毫秒为单位的时间。在QTime构造函数mds中计算如下:

 mds = (h*SECS_PER_HOUR + m*SECS_PER_MIN + s)*1000 + ms;

如果您只检查两个时间戳之间的差异是否在限制范围内,那么会更安全。例如:

while (it != _reminders.end() && abs(now.msecsTo(it.key())) < aLimitInMsecs) {

答案 1 :(得分:0)

如何初始化now

QDateTime上升到毫秒,因此toString()可以显示相同的值,而实际上值不同... 除非在某些时候将密钥_reminders [0]设置为now的值,否则它们将是不同的。

如果您要构建日历应用,则可以使用QString作为QMultiMap的键,其值为QDateTime::toString()的输出(格式取决于精度你愿意(白天,小时,分钟......)