Qt - kontener typu QMap

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 2470 razy

Kontener typu QMap umożliwia przechowywanie wartości w parach kluczwartość. Jest więc to odpowiednik tablicy asocjacyjnej z języków skryptowych. Odpowiednikiem tego kontenera jest omówiony na stronie Programowanie → Podstawy C++ → Kontener typu map - tablica asocjacyjna. Wadą i zaletą (w zależności od kryteriów użycia) tego kontenera jest sposób organizacji danych, który sprawia, że dodawanie kolejnych elementów jest czasochłonne. Dzieje się tak dlatego, że dodawane elementy są jednocześnie sortowane z wykorzystaniem struktury kopca. Zaletą takiego rozwiązania jest bardzo szybkie odnajdowanie określonego elementu.

Dodawanie elementów

Już na etapie tworzenia obiektu klasy QMap można przypisać mu wartości gdy wykorzystywany jest tryb kompilowania w standardzie C++ 11:

QMap<QString, int> map = { { "key1", 100 }, { "key2", 200 }, { "key3", 300 } };

Dodawanie kolejnych elementów może się odbywać np. tak:

QMap<QString, int> map = { { "key1", 200 }, { "key2", 300 } }; map.insert("key3", 500); map["key4"] = 400; qDebug() << map;

Powyższy kod wyświetli:

QMap(("key1", 200)("key2", 300)("key3", 500)("key4", 400))

Pozyskiwanie informacji o liczbie elementów zawartych

Istnieją dwie metody length i size, które zwracają liczbę elementów zawartych w obiekcie klasy QMap.

Iterowanie po elementach klasy QMap

Iterowanie w stylu C++ 11 umożliwia w wydajny sposób dostęp jedynie do wartości:

QMap<QString, int> map = { { "key1", 200 }, { "key2", 300 } }; for(auto element: map){ qDebug() << element; }

Wynik działania powyższego kodu:

200
300

Dużo lepszym sposobem jest iterowanie z wykorzystaniem wskaźnika:

QMap<QString, int> map = { { "key1", 200 }, { "key2", 300 } }; for(QMap<QString, int>::iterator i = map.begin(); i != map.end(); i++){ qDebug() << i.key() << "=" << i.value(); }

Jak widać tutaj mam dostęp do klucza i wartości za nim stojącej. Wynik działania powyższego kodu będzie więc następujący:

"key1" = 200
"key2" = 300

Można też iterować w następujący sposób:

QMap<QString, int> map = { { "key1", 200 }, { "key2", 300 } }; QMapIterator<QString, int> i(map); while (i.hasNext()) { i.next(); qDebug() << i.key() << "=" << i.value(); }

Wynik działania powyższego kodu:

"key1" = 200
"key2" = 300

Metody zwracające listę kluczy lub wartości

Metoda keys i values zwracają odpowiednio listę QList zawierającą klucze lub wartości. Oto przykład użycia tych metod:

QMap<QString, int> map = { { "key1", 200 }, { "key2", 300 } }; qDebug() << "keys:" << map.keys(); qDebug() << "values:" << map.values();

Wynik działania powyższego kodu:

keys: ("key1", "key2")
values: (200, 300)

Usuwanie elementów

Metoda remove umożliwia usunięcie klucza wraz z wartością za nim stojącą:

QMap<QString, int> map = { { "key1", 200 }, { "key2", 300 } }; qDebug() << map; map.remove("key2"); qDebug() << map;

Wynik działania powyższego kodu:

QMap(("key1", 200)("key2", 300))
QMap(("key1", 200))

Z kolei metodą clear można usunąć wszystkie elementy zawarte wewnątrz obiektu klasy QMap.

Zdejmowanie elementu stojącego za podanym kluczem i zwrócenie jego wartości

Metoda take usuwa dany klucz i zwraca jego wartość:

QMap<QString, int> map = { { "key1", 200 }, { "key2", 300 } }; qDebug() << map; qDebug() << "Take key2 value:" << map.take("key2"); qDebug() << "After take key2 value" << map;

Wynik działania powyższego kodu:

QMap(("key1", 200)("key2", 300))
Take key2 value: 300
After take key2 value QMap(("key1", 200))

Zamiana miejscami zawartości dwóch obiektów klasy QMap

Metoda swap zamienia miejscami elementy dwóch obiektów klas QMap. Oto przykład:

QMap<QString, int> map = { { "key1", 200 }, { "key2", 300 } }; QMap<QString, int> map2 = { { "key3", 400 }, { "key4", 500 } }; qDebug() << "Before swap map:" << map << "map2" << map2; map.swap(map2); qDebug() << "After swap map:" << map << "map2" << map2;

Wynik działania powyższego kodu:

Before swap map: QMap(("key1", 200)("key2", 300)) map2 QMap(("key3", 400)("key4", 500))
After swap map: QMap(("key3", 400)("key4", 500)) map2 QMap(("key1", 200)("key2", 300))
Strony powiązane
strony powiązane
  1. doc.qt.io/qt-5/qmap.html - opis klasy QMap
Propozycje książek