Оператор 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*\""

Может я не понял как это должно работать?


person Mark    schedule 05.10.2017    source источник
comment
Да, я уверен. Для проверки я установил его как: src.payload = "\"" + "HUB,PRESS,3" + "\"";   -  person Mark    schedule 05.10.2017
comment
@StoryTeller извини, ты прав. Я специалист по прошивке и привык писать на C...   -  person Mark    schedule 05.10.2017
comment
@drescherjm эта строка работает, я вижу вывод qDebug()! Проблема в том, что я не могу сопоставить начало строки, как в примере.   -  person Mark    schedule 05.10.2017


Ответы (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().

person Mark    schedule 05.10.2017
comment
Вероятно, вам также потребуется перегрузить >, чтобы убедиться, что e2 > e1 приводит к правильному поведению. - person frogatto; 05.10.2017
comment
@HiI'mFrogatto в коде я не могу найти использование qMapGreaterThanKey, а только qMapLessThanKey. Проверьте также этот комментарий: github.com/qt /qtbase/blob/ - person Mark; 05.10.2017
comment
Если две вещи сравнимы, их сопоставимость должна сохраняться во всех ситуациях, а не только при использовании с QMap. - person frogatto; 05.10.2017