Как изменить порядок одинаковых ключей при вставке с помощью insertMulti в QMAP?

У меня есть структура данных QMAP. Теперь я хочу вставить тип QVariant в QMAP. Данные вставляются на основе приоритета. Например, приоритет 1, 2 и т. д. Эти приоритеты являются ключевыми в QMAP. Однако у меня могут быть одинаковые значения ключей, что означает одинаковый приоритет. Это означает, что приоритет 1 и 1 могут иметь разные QVariant. Чтобы этого хватило, я использую insertMulti, а не вставку. Теперь трудность заключается в том, что последняя вставкаMulti с тем же ключом вставляется поверх ранее вставленного значения. Теперь, как я могу сделать это наоборот?

QMAP<int, QVariant> grp;

grp.insertMulti(0, "HELLO");
grp.insetMulti(0. "Hi");

При чтении значений -

Сначала он возвращает привет. Однако я хочу, чтобы он возвращал Hello. Как я могу это сделать? Пожалуйста, не давайте ответы, используя другие структуры данных. Это фрагмент очень сложной проблемы.


person dexterous    schedule 23.09.2014    source источник
comment
Как вы читаете значения? Обратите внимание, что существует перегруженная функция insertMulti, позволяющая указать позицию вставки элемента: qt-project.org/doc/qt-5/qmap.html#insertMulti-2   -  person TheDarkKnight    schedule 23.09.2014
comment
Я использую .value() для чтения значений обратно.   -  person dexterous    schedule 23.09.2014
comment
.value() возвращает только один элемент. Вы имеете в виду .values(const Key & key) или выполняете итерацию по классу? Возможно, вы можете добавить этот код к своему вопросу.   -  person TheDarkKnight    schedule 23.09.2014


Ответы (3)


Проблема не в том, как значения хранятся внутри карты, а в том, как получить их в требуемом «приоритетном» порядке.

Поскольку вы заявили, что «данные вставляются на основе приоритета» и вы хотите, чтобы значения извлекались в том же порядке, вы можете использовать QMap::values(const Key & key) const, для которой в документах указано: -

Возвращает список, содержащий все значения, связанные с ключом key, от самого последнего до последнего добавленного.

person TheDarkKnight    schedule 23.09.2014
comment
Да, но я хочу, чтобы он хранился как раз напротив него. - person dexterous; 23.09.2014
comment
Почему тебя волнует, как он хранится? Вы вставляете их в определенном порядке и таким образом извлекаете. Если вы хотите обратное, вы можете использовать функцию values(const Key&) и выполнить итерацию в обратном направлении, от итератора end() до begin(). Или добавьте их в обратном порядке, или я неправильно понимаю ваши требования? - person TheDarkKnight; 23.09.2014

Я бы сделал это следующим образом:

QMap<int, QVariant> grp;

grp.insertMulti(0, "HELLO");
grp.insertMulti(0, "Hi");

QList<QVariant> vl = grp.values(0);
QString firstInserted = vl.last().toString(); // Returns the 'HELLO'.
person vahancho    schedule 23.09.2014
comment
Я не хочу менять метод чтения. Я хочу изменить только процедуру сохранения. - person dexterous; 23.09.2014
comment
@dexterous_stranger, чем реализовать собственный класс контейнера. - person vahancho; 23.09.2014
comment
Мне приходит в голову идея повторить и снова скопировать карту. Теперь самые последние использованные окажутся наверху. Таким образом, в основном тот же самый ключ будет изменен сейчас. - person dexterous; 23.09.2014

Проблема. Если несколько ключей хранятся в одном ключе, предпочтение будет отдано последнему значению, добавленному для одного и того же ключа. В соответствии с документом — возвращает список, содержащий все значения, связанные с ключевым ключом, от самого последнего вставленного до наименее недавно вставленного.

Решение. Чтобы вернуть его к той же форме, снова пройдите QMAP и вставьте его в другой QMAP. Теперь значения, связанные с одним и тем же ключом, будут снова перевернуты — на основе недавно использованного фундаментального значения будет вверху для того же значения ключа.

QMAP<int, QVariant> grp;

grp.insertMulti(0, "HELLO");
grp.insetMulti(0. "Hi");

решение

QMAP<int, QVariant> pgrp;

QMap<int, QVariant>::const_iterator pGroupServiceIterator = grp.constBegin();

while (pGroupServiceIterator != grp.constEnd())
            {
                   pgrp.insertMulti(pGroupServiceIterator.key(),pGroupServiceIterator.value());

               ++pGroupServiceIterator;
            }

Теперь вы получите сначала «HELLO», а не «Hi», когда pgrp будет пройден и напечатан.

person dexterous    schedule 23.09.2014