Заказ товаров в QMap и QMultiMap

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

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

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

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

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

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

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

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

1 ответ

Решение

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

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

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

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

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

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