Qt - kontener typu QSet

Autor podstrony: Krzysztof Zajączkowski

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

Kontener typu QSet przeznaczony jest do przechowywania zbiorów danych, czyli takich elementów, które w danym zbiorze są niepowtarzalne. Odpowiednikiem tego kontenera jest wcześniej omawiany kontener typu set, który omawiany był na stronie Programowanie → Podstawy C++ → Kontener typu set - zbiór. Warto też mieć na uwadze kontener w wersji niesortowanej czyli unordered_set omawiany na stronie Programowanie → Podstawy C++ → Kontener typu unordered_set - zbiór niesortowany.

Tego typu kontenery są przydatne, gdy zachodzi konieczność np. uzyskania zbioru niepowtarzalnych elementów znajdujących się np w jakiejś tablicy lub kontenerze. Oto przykład:

QStringList names = { "Arnold", "Ania", "Kasia", "Adam", "Mirek", "Ewa", "Kasia", "Zenek", "Maciek", "Wiesław", "Adam", "Mirek", "Damian" }; QSet<QString> set = names.toSet(); qDebug() << "Imiona:" << names; qDebug() << "Niepowtarzalne imiona:" << set;

Wynik działania powyższego kodu:

Imiona: ("Arnold", "Ania", "Kasia", "Adam", "Mirek", "Ewa", "Kasia", "Zenek", "Maciek", "Wiesław", "Adam", "Mirek", "Damian")
Niepowtarzalne imiona: QSet("Maciek", "Wiesław", "Adam", "Mirek", "Ania", "Ewa", "Zenek", "Arnold", "Kasia", "Damian")

Dodawanie elementów

Możliwe jest przypisanie elementów zbioru w stylu C++ 11:

QSet<QString> set = { "alpha", "betha" }; qDebug() << set;

Wynik działania powyższego kodu:

QSet("alpha", "betha")

Możliwe jest również dodanie nowego elementu za pomocą metody insert:

QSet<QString> set = { "alpha", "betha" }; qDebug() << set; set.insert("delta"); qDebug() << set;

Wynik działania powyższego kodu:

QSet("alpha", "betha")
QSet("alpha", "betha", "delta")

Można też dodawać kolejne elementy za pomocą operatora dodawania + lub dodawania z podstawieniem += w następujący sposób:

set += { "epsilon", "eta" }; qDebug() << set;

Co spowoduje wyświetlenie:

QSet("epsilon", "alpha", "betha", "eta", "delta")

Ten sam efekt można uzyskać w następujący sposób:

QStringList list = { "epsilon", "eta" }; set += list.toSet();

Pozyskiwanie informacji o liczbie elementów

Metoda size zwraca liczbę elementów zawartych w obiekcie klasy QSet.

Operacje na zbiorach

Zbiory można dodawać, odejmować oraz obliczać część wspólną zbiorów. Oto przykład wykonywania tego typu operacji na zbiorach:

QSet<QString> set1 = { "alpha", "betha" }; set1.insert("delta"); set1 += { "epsilon", "eta" }; QSet<QString> set2 = {"alpha", "gamma"}; qDebug() << "zbior 1:" << set1; qDebug() << "zbior 2:" << set2; qDebug() << "czesc wspolna dwoch zbiorow:" << (set1 & set2); qDebug() << "suma dwoch zbiorow:" << (set1 | set2); qDebug() << "roznica dwoch zbiorow:" << (set1 - set2);

Wynik działania powyższego kodu:

zbior 1: QSet("alpha", "betha", "delta", "eta", "epsilon")
zbior 2: QSet("alpha", "gamma")
czesc wspolna dwoch zbiorow: QSet("alpha")
suma dwoch zbiorow: QSet("alpha", "betha", "delta", "gamma", "eta", "epsilon")
roznica dwoch zbiorow: QSet("betha", "delta", "eta", "epsilon")

Odpowiednikiem operatów:

Zamiana elementów dwóch zbiorów miejscami

Do zamiany elementów dwóch zbiorów miejscami służy metoda swap:

QSet<QString> set1 = { "alpha", "betha", "delta", "epsilon", "eta" }; QSet<QString> set2 = {"alpha", "gamma"}; qDebug() << "Before swap: set1 =" << set1 << "set2 =" << set2; set1.swap(set2); qDebug() << "After swap: set1 =" << set1 << "set2 =" << set2;

Wynik działania powyższego kodu:

Before swap: set1 = QSet("epsilon", "alpha", "betha", "delta", "eta") set2 = QSe
t("alpha", "gamma")
After swap: set1 = QSet("alpha", "gamma") set2 = QSet("epsilon", "alpha", "betha
", "delta", "eta")
Strony powiązane
strony powiązane
  1. doc.qt.io/qt-4.8/qset.html - opis klasy QSet w dokumentacji biblioteki Qt
Propozycje książek