Qt - kontener typu QMap
Stronę tą wyświetlono już: 1866 razy
Kontener typu QMap umożliwia przechowywanie wartości w parach klucz → wartość. 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))

Tytuł:
Architektura oprogramowania bez tajemnic. Wykorzystaj język C++ do tworzenia wydajnych aplikacji i systemów
Autor:
Adrian Ostrowski, Piotr Gaczkowski

Tytuł:
Opus magnum C++ 11. Programowanie w języku C++. Wydanie II poprawione (komplet)
Autor:
Jerzy Grębosz

Tytuł:
Programowanie wieloplatformowe z C++ i wxWidgets 3
Autor:
Bartosz W. Warzocha

Tytuł:
Język C++ i przetwarzanie współbieżne w akcji. Wydanie II
Autor:
Anthony Williams

Tytuł:
C++ dla bystrzaków. Wydanie VII
Autor:
Stephen R. Davis

Tytuł:
Tablice informatyczne. Podstawy C++
Autor:
Radosław Sokół

Tytuł:
Opus magnum C++11. Programowanie w języku C++ (komplet)
Autor:
Jerzy Grębosz

Tytuł:
OpenCV 3. Komputerowe rozpoznawanie obrazu w C++ przy użyciu biblioteki OpenCV
Autor:
Adrian Kaehler, Gary Bradski

Tytuł:
C++ w 24 godziny. Wydanie VI
Autor:
Rogers Cadenhead, Jesse Liberty

Tytuł:
C++ Optymalizacja kodu. Sprawdzone techniki zwiększania wydajności
Autor:
Guntheroth Kurt