QMap

QMap похож на QHash. В отличии от QList и QVector у QMap нет метода appendpush_back, push_front. То есть у QMap ключ всегда указывается явно, у него нельзя добавить в конец контейнера или в начало контейнера.

Упорядочивание всегда происходит по ключу!  QHash тоже не поможет, он вообще упорядочивает произвольно, по какой-то своей внутренней хэш таблице для убыстрения поиска по ключу.

Упорядочивание по ключу это гемморой. В std::map C++98 тоже упорядочивание по ключу. То есть если вам пришла строка json и вы ее парсите в QMap или std::map вы получаете другой порядок объектов (не такой как был изначально в строке json). Что делать?

Похоже надо использовать список (он же массив) в json -  [ ... ] . Он точно гарантирует правильный порядок вложенных элементов следующего уровня вложенности. 

insert

Есть insert(idx , blablabla) или просто [idx]=blablabla.
Ключ idx(индекс) может быть любым значением, в отличие от QList и QVector. То есть если размер контейнера например 55, то insert(101 , blablabla) в QMap прокатит, а в QList и QVector выдаст ошибку  "index out of range".

Другое отличие insert в QMap в том, что insert в QMap затрет значение с таким же ключом (если такой ключ уже есть), а в QList и QVector insert в вставит значение, а если имеется с таким же ключом значение, то его сместит вниз.

Значение как обычно может быть любым типом данных, простой тип данных, класс, указатель на что угодно т.д.

Как обычно тестируем (на Qt 4.8.1 msvc-2010) управление контейнером:

class A
{
public:
    A() // default ctor
    {
        ii=111;
    }
    A(int ii_) // users ctor
    {
        ii=ii_;
    }

    int ii;
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QMap< int , A > map;

    map[1] = A();
    map[4] = A(222);
    map[5] = A(333);
    map.insert(5, A(444)); // затрет существующее значение

    qDebug("----- foreach -----");

    foreach(A a, map)
        qDebug("a.%i", a.ii);

    qDebug("map size=%i count=%i" , map.size() , map.count());

    return a.exec();
}


Вывод в консоль будет таким:

----- foreach -----
a.111
a.222
a.444
map size=3 count=3

Может показаться ,что метод take читает элемент из контейнера по ключу, но на самом деле он еще и уничтожает его после этого.

Наше небольшое развитие QMap;.как изменить в многоуровневом контейнере QMap глубоко вложенный элемент.