А что если попробовать сделать свой контейнер

После долгого использования QMap, QHash чего-то захотелось реализовать свой вариант контейнера.

Чего нам не хватало?

Задолбало возвращение элемента по значению

Опрератор [ ] возвращает ссылку не константную с одновременным созданием элемента (если он ещё не существует) 

Либо оператор [ ] возвращает константу по значению.

Как следствие мы имеем глобально проблему с управлением контейнером, а именно описанную здесь как изменить в многоуровневом контейнере QMap глубоко вложенный отдельный элемент

Почему нельзя вернуть const & на элемент тоже понятно. Потому, что элемент может ещё не существовать вообще по такому-то ключу. Конечно можно проверить через contains, но это не решает вопрос - что же делать если элемент не существует.

И вот нам пришла мысль подкупающая своей новизной.

Если мы не можем вернуть константную ссылку в случае, когда элемент не существует, значит нам надо иметь при создании контейнера такой элемент обязательно (дефлотно). Можем его обозвать типа UNDEFINED к примеру.

Соответственно теперь можно реализовать оператор получения элемента как const &. Вслучае отсутствия элемента контейнера по ключу возвращать UNDEFINED элемент. Что может быть проще. Вот и вся идея.

Упорядочивание по порядку добавления

И ещё хотелось бы иметь контейнер с упорядочиванием по порядку добавления элементов (как QList например).

Дело в том, что QMap сортирует по ключу, а QHash сортирует произвольно (в буквальном смысле). А иногда надо, что бы сортировка оставалась по порядку добавления элементов.