Порядок элементов в QMap и QMultiMap

Я хотел бы использовать QMultiMap (который получен из QMap) для хранения пар ключ/значение. Поскольку у меня могут быть ключи несколько раз, я бы предпочел использовать QMultiMap.

Предположим, я бы вставил следующие пары в заданном порядке:

"C" -> 5
"A" -> 10
"B" -> 77
"B" -> 1
"X" -> 314159

При переборе карты (предпочтительно с использованием итераторов в стиле Java) мне нужно сохранить порядок пар равных ключей. т.е. "B" -> 77 и "B" -> 1 должны отображаться точно в порядке вставки при повторении. Порядок между разными ключами не имеет значения.

К сожалению, в документации ничего не говорится об этой детали. Это говорит

В QMap элементы всегда сортируются по ключу.

но он не говорит, если/как он сортирует одинаковые ключи.

Сохраняет ли QMap порядок вставки пар с одинаковыми ключами или его можно каким-то образом сохранить?


person Silicomancer    schedule 23.11.2014    source источник


Ответы (2)


Из документации Qt о QMap::iterator :

В отличие от QHash, который хранит свои элементы в произвольном порядке, QMap хранит свои элементы в порядке ключа. Элементы с одним и тем же ключом (поскольку они были вставлены с помощью QMap::insertMulti() или из-за объединения()) будут отображаться последовательно, от самого последнего до самого последнего вставленного значения.

Таким образом, кажется, что QMap сохраняет обратный порядок вставки пар с одинаковыми ключами.

person Nejat    schedule 23.11.2014
comment
Это то, что я искал. Спасибо. Это означает, что решение моей проблемы должно заключаться в переборе карты в обратном порядке. - person Silicomancer; 23.11.2014

Существует перегрузка QMap::insertMulti(const_iterator pos, const Key &key, const T &value), где pos — это «подсказка», и вы можете передать constBegin() или constEnd(), или какой-либо итератор в середине коллекции, где вы хотите сделать вставку. Это способ диктовать порядок, когда у вас есть дубликаты ключей.

Я думаю, что это может быть удачей, что обычно можно увидеть порядок, сохраненный, как если бы это был стек...

person BuvinJ    schedule 04.10.2019