Оператор QMap <()

Я не уверен, что правильно понял документы. Я хочу определить свой собственный <() оператор для QMultiMap для того, чтобы использовать пользовательский тип и определить конкретный values(const Key &key) поведение.

Требуемое поведение - извлечь все значения, которые имеют одинаковую группу и событие ключа поиска (src), и строку полезной нагрузки, которая соответствует начальной части значения в src. Пример:

Полезный груз в ключе на моей карте может быть: "HUB,PRESS*". Если src соответствует значениям группы и события и имеет следующую полезную нагрузку:"HUB,PRESS,3" должен извлечь вышеуказанный элемент (поскольку полезная нагрузка src начинается с той же строковой части).

Вот моя реализация:

struct event_t {
    int group;
    int event;    
    QString payload;
};

inline bool operator <(const event_t &e1, const event_t &e2)
{
    if (e1.group != e2.group) return e1.group < e2.group;
    if (e1.event != e2.event) return e1.event < e2.event;

    if (e2.payload.endsWith("*\""))
    {
        qDebug() << e1.payload << e2.payload;
        QString s2 = e2.payload.mid(0, e2.payload.size() - 2);
        QString s1 = e1.payload.mid(0, s2.size());
        s1.append("\"");
        s2.append("\"");
        return s1 < s2;
    }

    return e1.payload < e2.payload;
}

Вот простой пример использования:

QMultiMap<event_t, event_t> m_map;
// fill with some items, one has the key like: "HUB,PRESS*"

event_t src;
// populate it

QList<event_t> dst = m_map.values(src);

Проблема в том, что я никогда не вижу отладочную версию src для доступных элементов (как я ожидаю от values() код). Вместо моего qDebug() печатает одно и то же значение для e1 e e2 (которое хранится на моей карте), а не для src. То есть:

"\"HUB,PRESS*\"" "\"HUB,PRESS*\""

Возможно, я не понял, как это должно работать?

1 ответ

Решение

Вот рабочий код:

inline bool operator <(const event_t &e1, const event_t &e2)
{
    if (e1.group != e2.group) return e1.group < e2.group;
    if (e1.event != e2.event) return e1.event < e2.event;

    if (e1.payload.endsWith("*\""))
    {
        QString s1 = e1.payload.mid(0, e1.payload.size() - 2);
        QString s2 = e2.payload.mid(0, s1.size());
        s1.append("\"");
        s2.append("\"");
        return s1 < s2;
    }

    return e1.payload < e2.payload;
}

Я не знаю почему, но значение src содержится в e1, а не в e2, как я ожидал от реализации values ​​().

Другие вопросы по тегам