Qt - kontener typu QList

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

Omawiana wcześniej klasa QStringList bazuje zasadniczo na klasie QList, która jest klasą szablonową przeznaczoną do przechowywania zmiennych wybranego typu. Żeby skorzystać z tej klasy konieczne jest załączenie pliku QList.

Dodawanie elementów do obiektu klasy QList

Dodanie kolejnych elementów można przeprowadzić na kilka różnych sposobów, jednym z nich jest przypisanie w stylu C++ 11:

Listing 1
  1. QList<int> list = {10, 20};
  2. qDebug() << list;

Można również dodawać na różne sposoby kolejne elementy do takiej listy:

Listing 2
  1. QList<int> list = {10, 20};
  2. qDebug() << list;
  3. list.append(30);
  4. list.append({40, 50});
  5. qDebug() << list;
  6. list.prepend(60);
  7. qDebug() << list;
  8. list << 70 << 80;
  9. qDebug() << list;
  10. list += 90;
  11. list += {100, 110};
  12. qDebug() << list;
  13. list.push_back(120);
  14. list.push_front(130);
  15. qDebug() << list;
  16. list.insert(list.begin() + 2, 130);
  17. qDebug() << list;

Wynik działania powyższego kodu:

(10, 20)
(10, 20, 30, 40, 50)
(60, 10, 20, 30, 40, 50)
(60, 10, 20, 30, 40, 50, 70, 80)
(60, 10, 20, 30, 40, 50, 70, 80, 90, 100, 110)
(130, 60, 10, 20, 30, 40, 50, 70, 80, 90, 100, 110, 120)
(130, 60, 10, 130, 20, 30, 40, 50, 70, 80, 90, 100, 110, 120)

Pozyskiwanie informacji o liczbie elementów zawartych w liście

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

Iterowanie po elementach listy

Iterowanie można wykonać na kilka sposobów. Pierwszy z nich wykorzystuje indeksowanie:

Listing 3
  1. QList<int> list = {10, 20, 30};
  2. for(int i = 0; i < list.length(); i++){
  3. qDebug() << list.at(i);
  4. }

Można też iterować wykorzystując wskaźniki:

Listing 4
  1. QList<int> list = {10, 20, 30};
  2. for(QList<int>::iterator i = list.begin(); i < list.end(); i++){
  3. qDebug() << *i;
  4. }

Jeżeli dodana została obsługa standardu C++ 11 można sobie ułatwić życie iterując w następujący sposób:

Listing 5
  1. QList<int> list = {10, 20, 30};
  2. for(auto element: list){
  3. qDebug() << element;
  4. }

I w końcu można iterować po elementach listy w stylu Javy:

Listing 6
  1. QList<int> list = {10, 20, 30};
  2. QListIterator<int> javaStyleIterator(list);
  3. while (javaStyleIterator.hasNext())
  4. qDebug() << javaStyleIterator.next();

Sprawdzanie, czy na liście znajduje się podany element

Za pomocą metody contains można sprawdzić, czy na liście znajduje się podany element. Oto przykład:

Listing 7
  1. QList<int> list = {10, 20, 30};
  2. if(list.contains(10)){
  3. qDebug() << "Lista zawiera co najmniej jeden element rowny 10";
  4. }

Znalezienie indeksu pierwszego lub ostatniego wystąpienia danej wartości w liście

By znaleźć ostatni lub pierwszy indeks, pod którym znajduje się szukana wartość należy skorzystać z metody indexOf lub lastIndexOf w następujący sposób:

Listing 8
  1. QList<int> list = {10, 20, 30};
  2. int index = list.indexOf(20);
  3. if(index != -1){
  4. qDebug() << index;
  5. }

Usuwanie elementów z listy

Istnieje szereg metod, które umożliwiają usuwanie elementów z listy QList. Oto przykład ich użycia:

Listing 9
  1. QList<int> data = {100, 200, 300, 400, 500, 600, 600, 700, 100};
  2. qDebug() << data;
  3. data.removeAll(600); // usuwam wszystkie wartości równe 600
  4. qDebug() << data;
  5. data.removeFirst(); // usuwam pierwszy element
  6. qDebug() << data;
  7. data.removeLast(); // usuwam ostatni element
  8. qDebug() << data;
  9. data.removeAt(2); // usuwam 3 element (indeksowanie od 0)
  10. qDebug() << data;

Wynik działania powyższego kodu:

(100, 200, 300, 400, 500, 600, 600, 700, 100)
(100, 200, 300, 400, 500, 700, 100)
(200, 300, 400, 500, 700, 100)
(200, 300, 400, 500, 700)
(200, 300, 500, 700)

Zdejmowanie pierwszego i ostatniego elementu listy

Metody takeFirst i takeLast umożliwiają zdjęcie pierwszego i ostatniego elementu listy z jednoczesnym jego zwróceniem.

Listing 10
  1. QList<int> data = {100, 200, 300, 400, 500, 600, 600, 700, 100, 300, 400, 500, 600, 700, 800};
  2. qDebug() << data;
  3. qDebug() << "Get first one: " << data.takeFirst();
  4. qDebug() << "After remove first one: " << data;
  5. qDebug() << "Get last one: " << data.takeLast();
  6. qDebug() << "After remove last one: " << data;
  7. qDebug() << "Get 3rd one: " << data.takeAt(2);
  8. qDebug() << "After remove 3rd one: " << data;

Wynik działania powyższego kodu:

(100, 200, 300, 400, 500, 600, 600, 700, 100, 300, 400, 500, 600, 700, 800)
Get first one:  100
After remove first one:  (200, 300, 400, 500, 600, 600, 700, 100, 300, 400, 500, 600, 700, 800)
Get last one:  800
After remove last one:  (200, 300, 400, 500, 600, 600, 700, 100, 300, 400, 500, 600, 700)
Get 3rd one:  400
After remove 3rd one:  (200, 300, 500, 600, 600, 700, 100, 300, 400, 500, 600, 700)

Wyciąganie części elementów z wnętrza listy

Metoda mid umożliwia wyciągnięcie dowolnej liczby elementów z wnętrza listy. Oto przykład:

Listing 11
  1. QList<int> data = {100, 200, 300, 400, 500, 600, 600, 700, 100, 300, 400, 500, 600, 700, 800};
  2. QList<int> subData = data.mid(3, 5);
  3. qDebug() << data;
  4. qDebug() << subData;

Wynik działania powyższego kodu:

(100, 200, 300, 400, 500, 600, 600, 700, 100, 300, 400, 500, 600, 700, 800)
(400, 500, 600, 600, 700)

Przenoszenie elementu listy

Metoda move umożliwia przeniesienie elementu o podanym indeksie na inną pozycję:

Listing 12
  1. QList<int> data = {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0};
  2. qDebug() << data;
  3. data.move(5, 10);
  4. qDebug() << data;

Wynik działania powyższego kodu:

(0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0)
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1)

Łączenie dwóch list

Łączenie dwóch list umożliwia operator dodawania z podstawianiem += oraz dodawania +. Oto przykład:

Listing 13
  1. QList<int> data = {0, 1, 2};
  2. QList<int> data2 = {3, 4, 5, 6};
  3. qDebug() << data + data2;
  4. data2 += data;
  5. qDebug() << data2;

Wynik działania powyższego kodu:

(0, 1, 2, 3, 4, 5, 6)
(3, 4, 5, 6, 0, 1, 2)

Zamiana elementów list miejscami

Jeżeli zachodzi konieczność zamiany miejscami elementów dwóch list, to najszybszą metodą wykonania tego zadania jest użycie metody swap w następujący sposób:

Listing 14
  1. QList<int> data = {0, 1, 2};
  2. QList<int> data2 = {3, 4, 5, 6};
  3. qDebug() << "Before swap: data =" << data << "data2 =" << data2;
  4. data.swap(data2);
  5. qDebug() << "After swap: data =" << data << "data2 =" << data2;

Wynik działania powyższego kodu:

Before swap: data = (0, 1, 2) data2 = (3, 4, 5, 6)
After swap: data = (3, 4, 5, 6) data2 = (0, 1, 2)
Strony powiązane
strony powiązane
  1. doc.qt.io/qt-5/qlist.html - strona dokumentacji opisująca klasę QList

Komentarze