Qt - kontener typu QList
Stronę tą wyświetlono już: 2377 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)