Qt - kontener typu QList

Autor podstrony: Krzysztof Zajączkowski

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

QList<int> list = {10, 20}; qDebug() << list;

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

QList<int> list = {10, 20}; qDebug() << list; list.append(30); list.append({40, 50}); qDebug() << list; list.prepend(60); qDebug() << list; list << 70 << 80; qDebug() << list; list += 90; list += {100, 110}; qDebug() << list; list.push_back(120); list.push_front(130); qDebug() << list; list.insert(list.begin() + 2, 130); 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:

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

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

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

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

QList<int> list = {10, 20, 30}; for(auto element: list){ qDebug() << element; }

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

QList<int> list = {10, 20, 30}; QListIterator<int> javaStyleIterator(list); while (javaStyleIterator.hasNext()) 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:

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

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:

QList<int> list = {10, 20, 30}; int index = list.indexOf(20); if(index != -1){ qDebug() << index; }

Usuwanie elementów z listy

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

QList<int> data = {100, 200, 300, 400, 500, 600, 600, 700, 100}; qDebug() << data; data.removeAll(600); // usuwam wszystkie wartości równe 600 qDebug() << data; data.removeFirst(); // usuwam pierwszy element qDebug() << data; data.removeLast(); // usuwam ostatni element qDebug() << data; data.removeAt(2); // usuwam 3 element (indeksowanie od 0) 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.

QList<int> data = {100, 200, 300, 400, 500, 600, 600, 700, 100, 300, 400, 500, 600, 700, 800}; qDebug() << data; qDebug() << "Get first one: " << data.takeFirst(); qDebug() << "After remove first one: " << data; qDebug() << "Get last one: " << data.takeLast(); qDebug() << "After remove last one: " << data; qDebug() << "Get 3rd one: " << data.takeAt(2); 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:

QList<int> data = {100, 200, 300, 400, 500, 600, 600, 700, 100, 300, 400, 500, 600, 700, 800}; QList<int> subData = data.mid(3, 5); qDebug() << data; 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ę:

QList<int> data = {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}; qDebug() << data; data.move(5, 10); 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:

QList<int> data = {0, 1, 2}; QList<int> data2 = {3, 4, 5, 6}; qDebug() << data + data2; data2 += data; 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:

QList<int> data = {0, 1, 2}; QList<int> data2 = {3, 4, 5, 6}; qDebug() << "Before swap: data =" << data << "data2 =" << data2; data.swap(data2); 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