Szukaj…


Uwagi

Qt zapewnia własne klasy kontenerów szablonów. Wszystkie są domyślnie udostępniane. Zapewniają dwa rodzaje iteratorów (styl Java i styl STL).

Kolejne kontenery Qt obejmują: QVector, QList, QLinkedList, QStack, QQueue.

Kontenery asocjacyjne Qt obejmują: QMap, QMultiMap, QHash, QMultiHash, QSet.

Wykorzystanie QStack

QStack<T> to szablonowa klasa Qt zapewniająca stos. Jego analogiem w STL jest std::stack . Jest to ostatnia, pierwsza struktura (LIFO).

QStack<QString> stack;
stack.push("First");
stack.push("Second");
stack.push("Third");
while (!stack.isEmpty())
{
    cout << stack.pop() << endl;
}

Wyjdzie: trzeci, drugi, pierwszy.

QStack dziedziczy QVector więc jego realizacja jest zupełnie inny od STL. W STL std::stack jest zaimplementowany jako opakowanie do przekazania przekazywane jako argument szablonu (domyślnie deque). Nadal główne operacje są takie same dla QStack i dla std::stack .

Wykorzystanie QVector

QVector<T> zapewnia klasę szablonów dynamicznych tablic. Zapewnia lepszą wydajność w większości przypadków niż QList<T> więc powinien być pierwszym wyborem.

Można go zainicjować na różne sposoby:

QVector<int> vect;
vect << 1 << 2 << 3;

QVector<int> v {1, 2, 3, 4};

Najnowsza obejmuje listę inicjalizacji.

QVector<QString> stringsVector;
stringsVector.append("First");
stringsVector.append("Second");

W ten sposób możesz uzyskać i-ty element wektora:

v[i] lub at[i]

Upewnij się, że i jest prawidłową pozycją, nawet at(i) nie sprawdza, to różnica od std::vector .

Wykorzystanie QLinkedList

W Qt powinieneś użyć QLinkedList na wypadek, gdybyś musiał zaimplementować połączoną listę .

Szybkie dodawanie, dodawanie, wstawianie elementów do QLinkedList - O (1) jest szybkie, ale wyszukiwanie indeksu jest wolniejsze niż w QList lub QVector - O (n). Jest to normalne, biorąc pod uwagę, że musisz iterować przez węzły, aby znaleźć coś na połączonej liście.

Pełna algorytmiczna tabela współrzędności znajduje się tutaj .

Aby wstawić niektóre elementy do QLinkedList , możesz użyć operatora <<() :

QLinkedList<QString> list;
list << "string1" << "string2" << "string3";

Aby wstawić elementy w środku QLinkedList lub zmodyfikować wszystkie lub niektóre jego elementy, możesz użyć iteratorów w stylu Java lub STL. Oto prosty przykład, w jaki sposób pomnożymy wszystkie elementy QLinkedList przez 2:

QLinkedList<int> integerList {1, 2, 3};
QLinkedList<int>::iterator it;
for (it = integerList.begin(); it != integerList.end(); ++it)
{
    *it *= 2;
}

QList

Klasa QList to klasa szablonów zapewniająca listy. Przechowuje elementy na liście, która zapewnia szybki dostęp w oparciu o indeks oraz wstawianie i usuwanie w oparciu o indeks.

Aby wstawić elementy do listy, możesz użyć operator<<() , insert() , append() lub prepend() . Na przykład:

operator<<()

QList<QString> list;
list << "one" << "two" << "three";

insert()

QList<QString> list;
list << "alpha" << "beta" << "delta";
list.insert(2, "gamma");

append()

QList<QString> list;
list.append("one");
list.append("two");
list.append("three");

prepend()

QList<QString> list;
list.prepend("one");
list.prepend("two");
list.prepend("three");

Aby uzyskać dostęp do elementu w określonej pozycji indeksu, możesz użyć operator[]() lub at() . at() może być szybszy niż operator[]() , nigdy nie powoduje głębokiej kopii kontenera i powinien działać w stałym czasie. Żadne z nich nie sprawdza argumentów. Przykłady:

if (list[0] == "mystring")
    cout << "mystring found" << endl;

Lub

if (list.at(i) == "mystring")
    cout << "mystring found at position " << i << endl;

Aby usunąć elementy, istnieją funkcje takie jak removeAt() , takeAt() , takeFirst() , takeLast() , removeFirst() , removeLast() lub removeOne() . Przykłady:

takeFirst()

// takeFirst() removes the first item in the list and returns it
QList<QWidget *> list;
...
while (!list.isEmpty())
    delete list.takeFirst();

removeOne()

// removeOne() removes the first occurrence of value in the list
QList<QString> list;
list << "sun" << "cloud" << "sun" << "rain";
list.removeOne("sun");

Aby znaleźć wszystkie wystąpienia określonej wartości na liście, możesz użyć indexOf() lub lastIndexOf() . Przykład:

indexOf()

int i = list.indexOf("mystring");
if (i != -1)
    cout << "First occurrence of mystring is at position " << i << endl;


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow