La classe QMap rappresenta un generico contenitore, rappresentante un dizionario, che permette di conservare una coppia <chiave, valore> e di ricercare velocemente il valore associato ad una determinata chiave. La complessità dell’inserimento è O(log n), così come l’inserimento.
All’interno di una QMap, gli elementi sono ordinati per chiave. E’ dunque necessario che la chiave definisca il metodo operator<(), per consentire l’ordinamento.

L’inserimento all’intero di una QMap avviene con l’operatore [] oppure con i metodi insert e insertMulti:

T& QMap::operator[](const Key& key)
iterator QMap::insert(const Key& key, const T& value)
itarator QMap::insertMulti(const Key& key, const T&value)

L’operatore [] ritorna l’indirizzo del valore associato alla chiave passata, mentre le insert ritornano un iteratore all’elemento inserito.
In particolare, se viene utilizzato insertMulti ed esiste già un elemento associato alla medesima chiave, viene creato un nuovo elemento, mentre insert rimpiazza l’elemento inserito più recentemente:

#include <QtCore/QCoreApplication>
#include <QMap>
#include <QString>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
	QMap<int, int> mi;

	for(int i = 0; i < 5; i++)
		mi[i] = i*i;

	for(int i = 6; i <= 10; i++)
		mi.insert(i, i);	

	mi.insert(10, 11);

	qDebug() << mi;
    return a.exec();
}

Per recuperare un valore all’interno di una QMap bisogna utilizzare l’operatore [] o il metodo value. Se la mappa non ha associato alcun elemento alla chiave, il metodo value ritornerà un valore di default. Questo valore è anche specificabile attraverso un’overload del metodo:

qDebug() << mi[1]; // = 1
qDebug() << mi.value(2); // = 4
qDebug() << mi.value(11); // = 0 (default)
qDebug() << mi.value(11, 109); // = 109 (default specificato)

In generale è preferibile evitare l’utilizzo dell’operatore [] in quanto, se viene specificata una chiave non presente, questo crea un nuovo valore di default associato a quella chiave:

QMap<int, int> mi;
mi[0] = 10;
int t = mi[1]; // mi[1] non esiste, lui crea m[1] = 0

Per testare la presenza di una determinata chiave all’interno della mappa, viene utilizzato il metodo contains:

QMap<int, int> mi;

mi[0] = 10;
int t = mi[1]; // crea elemento default
qDebug() << mi.contains(1); // stampa 'true'

L’iterazione all’interno di una QMap avviene utilizzando gli iteratori in stile Java o in stile STL:

// Stile Java
QMapIterator<int,int> iter(mi);

while(iter.hasNext())
	qDebug() << iter.next().value();

// Stile STL
for( QMap<int, int>::iterator i = mi.begin(); i != mi.end(); i++)
	qDebug() << *i;

// Iteratore costante
for( QMap<int, int>::const_iterator i = mi.constBegin();
i != mi.constEnd();
i++)
{
	qDebug() << *i;
	//*i = 10; // <- Errore
}

Per ottenere una lista di chiavi e di valori, possiamo utilizzare i relativi metodi:

QList<int> keys = mi.keys(); // lista di tutte le chiavi
QList<int> values = mi.values(); // lista di tutti i valori
qDebug() << keys;
qDebug() << values;

La ricerca di una chiave avviene invece con il metodo find. Questo metodo ricerca una chiave passata come argomento e ritorna un iteratore che punta alla chiave. Se non viene trovata la chiave, viene ritornato end():

#include <QtCore/QCoreApplication>
#include <QMap>
#include <QList>
#include <QString>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
	QMap<QString, QString> map;

	map["User-Agent"] = "Mozilla";
	map["Host"] = "localhost";
	qDebug() << map;

	QMap<QString, QString>::const_iterator ci;

	ci = map.find("User-Agent"); // trovato
	qDebug() << *ci; // = Mozilla
	ci = map.find("user-Agent"); // non trovato
	if(ci != map.end())
		qDebug() << *ci;
	else
		qDebug() << "Non trovato";

	QMap<QString, QString>::iterator i = map.find("User-Agent");
	*i = "Safari"; // modifico il valore di User-Agent

	qDebug() << map; // = {<User-Agent, Safari>, <Host, localhost>}

    return a.exec();
}

Infine, l’eliminazione di una coppia da una mappa avviene utilizzando il metodo remove. E’ anche possibile eliminare tutto il suo contenuto con il metodo clear:

QMap<int, int> mi;
mi[1] = 10;
mi[2] = 20;
mi[3] = 30;
mi.remove(1);
qDebug() << mi; // mi = {<2, 20>, <3, 30>}
mi.clear();
qDebug() << mi; // mi = { }