Qt - kontener typu QMap

Stronę tą wyświetlono już: 32 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:

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

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

Listing 2
  1. QMap<QString, int> map = { { "key1", 200 }, { "key2", 300 } };
  2. map.insert("key3", 500);
  3. map["key4"] = 400;
  4. 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:

Listing 3
  1. QMap<QString, int> map = { { "key1", 200 }, { "key2", 300 } };
  2. for(auto element: map){
  3. qDebug() << element;
  4. }

Wynik działania powyższego kodu:

200
300

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

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

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:

Listing 5
  1. QMap<QString, int> map = { { "key1", 200 }, { "key2", 300 } };
  2. QMapIterator<QString, int> i(map);
  3. while (i.hasNext()) {
  4. i.next();
  5. qDebug() << i.key() << "=" << i.value();
  6. }

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:

Listing 6
  1. QMap<QString, int> map = { { "key1", 200 }, { "key2", 300 } };
  2. qDebug() << "keys:" << map.keys();
  3. 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ą:

Listing 7
  1. QMap<QString, int> map = { { "key1", 200 }, { "key2", 300 } };
  2. qDebug() << map;
  3. map.remove("key2");
  4. 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ść:

Listing 8
  1. QMap<QString, int> map = { { "key1", 200 }, { "key2", 300 } };
  2. qDebug() << map;
  3. qDebug() << "Take key2 value:" << map.take("key2");
  4. 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:

Listing 9
  1. QMap<QString, int> map = { { "key1", 200 }, { "key2", 300 } };
  2. QMap<QString, int> map2 = { { "key3", 400 }, { "key4", 500 } };
  3. qDebug() << "Before swap map:" << map << "map2" << map2;
  4. map.swap(map2);
  5. 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

Komentarze