QMap

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

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

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 глубоко вложенный элемент.