Qt - kontener typu QSet

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

Listing 1
  1. QStringList names = { "Arnold", "Ania", "Kasia", "Adam", "Mirek", "Ewa", "Kasia", "Zenek", "Maciek", "Wiesław", "Adam", "Mirek", "Damian" };
  2. QSet<QString> set = names.toSet();
  3. qDebug() << "Imiona:" << names;
  4. 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:

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

Wynik działania powyższego kodu:

QSet("alpha", "betha")

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

Listing 3
  1. QSet<QString> set = { "alpha", "betha" };
  2. qDebug() << set;
  3. set.insert("delta");
  4. 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:

Listing 4
  1. set += { "epsilon", "eta" };
  2. qDebug() << set;

Co spowoduje wyświetlenie:

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

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

Listing 5
  1. QStringList list = { "epsilon", "eta" };
  2. 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:

Listing 6
  1. QSet<QString> set1 = { "alpha", "betha" };
  2. set1.insert("delta");
  3. set1 += { "epsilon", "eta" };
  4. QSet<QString> set2 = {"alpha", "gamma"};
  5. qDebug() << "zbior 1:" << set1;
  6. qDebug() << "zbior 2:" << set2;
  7. qDebug() << "czesc wspolna dwoch zbiorow:" << (set1 & set2);
  8. qDebug() << "suma dwoch zbiorow:" << (set1 | set2);
  9. 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:

  • & jest metoda intersect (część wspólna);
  • | jest metoda unite (suma);
  • - jest metoda subtract (odejmowanie)

Zamiana elementów dwóch zbiorów miejscami

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

Listing 7
  1. QSet<QString> set1 = { "alpha", "betha", "delta", "epsilon", "eta" };
  2. QSet<QString> set2 = {"alpha", "gamma"};
  3. qDebug() << "Before swap: set1 =" << set1 << "set2 =" << set2;
  4. set1.swap(set2);
  5. 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

Komentarze