Qt
Qt Container Classes
Zoeken…
Opmerkingen
Qt biedt zijn eigen sjablooncontainerklassen. Ze worden allemaal impliciet gedeeld. Ze bieden twee soorten iterators (Java-stijl en STL-stijl.)
Qt sequentiële containers zijn onder meer: QVector, QList, QLinkedList, QStack, QQueue.
Qt associatieve containers omvatten: QMap, QMultiMap, QHash, QMultiHash, QSet.
QStack gebruik
QStack<T>
is een sjabloon Qt-klasse die stapel biedt. De analoge in STL is std::stack
. Het is last in, first out structuur (LIFO).
QStack<QString> stack;
stack.push("First");
stack.push("Second");
stack.push("Third");
while (!stack.isEmpty())
{
cout << stack.pop() << endl;
}
Het zal uitvoeren: derde, tweede, eerste.
QStack
neemt over van QVector
dus de implementatie is heel anders dan STL. In STL wordt std::stack
geïmplementeerd als een wrapper om te worden doorgegeven als een sjabloonargument (standaard deque). De hoofdbewerkingen zijn nog steeds hetzelfde voor QStack
en voor std::stack
.
QVector gebruik
QVector<T>
biedt dynamische array-sjabloonklasse. Het biedt in de meeste gevallen betere prestaties dan QList<T>
dus het zou de eerste keuze moeten zijn.
Het kan op verschillende manieren worden geïnitialiseerd:
QVector<int> vect;
vect << 1 << 2 << 3;
QVector<int> v {1, 2, 3, 4};
De nieuwste bevat initialisatielijst.
QVector<QString> stringsVector;
stringsVector.append("First");
stringsVector.append("Second");
Je kunt het i-de element vector op deze manier krijgen:
v[i]
of at[i]
Zorg ervoor dat i
een geldige positie is, zelfs at(i)
maakt geen vinkje, dit is een verschil met std::vector
.
QLinkedList gebruik
In Qt moet u QLinkedList gebruiken voor het geval u een gelinkte lijst moet implementeren.
Het is snel om elementen toe te voegen, voor te zetten, in te voegen in QLinkedList
- O (1), maar het opzoeken van de index is langzamer dan in QList
of QVector
- O (n). Dit is normaal als je er rekening mee houdt dat je door knooppunten moet itereren om iets in een gekoppelde lijst te vinden.
Volledige algoritmische compexity tafel kan worden gevonden hier .
Om enkele elementen in QLinkedList
in te QLinkedList
, kunt u operator <<()
:
QLinkedList<QString> list;
list << "string1" << "string2" << "string3";
Om elementen in het midden van QLinkedList
in te voegen of alle of enkele elementen ervan te wijzigen, kunt u iterators in Java-stijl of STL-stijl gebruiken. Hier is een eenvoudig voorbeeld hoe we alle elementen van QLinkedList
met 2 vermenigvuldigen:
QLinkedList<int> integerList {1, 2, 3};
QLinkedList<int>::iterator it;
for (it = integerList.begin(); it != integerList.end(); ++it)
{
*it *= 2;
}
QList
De klasse QList
is een sjabloonklasse die lijsten biedt. Het slaat items op in een lijst die snelle indexgebaseerde toegang en indexgebaseerde invoegingen en verwijderingen biedt.
Om items in de lijst in te voegen, kunt u operator<<()
, insert()
, append()
of prepend()
. Bijvoorbeeld:
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");
Om toegang te krijgen tot het item op een bepaalde indexpositie, kunt u operator[]()
of at()
. at()
kan sneller zijn dan operator[]()
, het veroorzaakt nooit een diepe kopie van de container en zou constant moeten werken. Geen van beiden voert argumentcontrole uit. Voorbeelden:
if (list[0] == "mystring")
cout << "mystring found" << endl;
Of
if (list.at(i) == "mystring")
cout << "mystring found at position " << i << endl;
Om items te verwijderen, zijn er functies zoals removeAt()
, takeAt()
, takeFirst()
, takeLast()
, removeFirst()
, removeLast()
of removeOne()
. Voorbeelden:
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");
Als u alle exemplaren van een bepaalde waarde in een lijst wilt vinden, kunt u indexOf()
of lastIndexOf()
. Voorbeeld:
indexOf()
int i = list.indexOf("mystring");
if (i != -1)
cout << "First occurrence of mystring is at position " << i << endl;