Qt
Classi di contenitori Qt
Ricerca…
Osservazioni
Qt fornisce le proprie classi di contenitori template. Sono tutti implicitamente condivisi. Forniscono due tipi di iteratori (stile Java e stile STL).
I contenitori sequenziali Qt includono: QVector, QList, QLinkedList, QStack, QQueue.
I contenitori associativi Qt includono: QMap, QMultiMap, QHash, QMultiHash, QSet.
QStack di utilizzo
QStack<T>
è una classe Qt di template che fornisce stack. Il suo analogo in STL è std::stack
. È l'ultimo, la prima struttura (LIFO).
QStack<QString> stack;
stack.push("First");
stack.push("Second");
stack.push("Third");
while (!stack.isEmpty())
{
cout << stack.pop() << endl;
}
Produrrà: Terzo, Secondo, Primo.
QStack
eredita da QVector
quindi la sua implementazione è abbastanza diversa da STL. In STL std::stack
è implementato come wrapper da digitare passato come argomento template (deque di default). Le operazioni principali ancora sono le stesse per QStack
e per std::stack
.
Uso di QVector
QVector<T>
fornisce una classe template array dinamica. Fornisce prestazioni migliori nella maggior parte dei casi rispetto a QList<T>
quindi dovrebbe essere la prima scelta.
Può essere inizializzato in vari modi:
QVector<int> vect;
vect << 1 << 2 << 3;
QVector<int> v {1, 2, 3, 4};
L'ultimo include l'elenco di inizializzazione.
QVector<QString> stringsVector;
stringsVector.append("First");
stringsVector.append("Second");
Puoi ottenere l'elemento i-esimo del vettore in questo modo:
v[i]
o at[i]
Assicurati che i
sia una posizione valida, anche at(i)
non effettua un controllo, questa è una differenza rispetto a std::vector
.
Uso di QLinkedList
In Qt dovresti usare QLinkedList nel caso sia necessario implementare l' elenco collegato .
È veloce aggiungere, anteporre, inserire elementi in QLinkedList
- O (1), ma la ricerca dell'indice è più lenta che in QList
o QVector
- O (n). È normale prendere in considerazione che devi scorrere i nodi per trovare qualcosa nella lista collegata.
La tabella completa della compexity algoritmica può essere trovata qui .
Solo per inserire alcuni elementi in QLinkedList
è possibile utilizzare l'operatore <<()
:
QLinkedList<QString> list;
list << "string1" << "string2" << "string3";
Per inserire elementi nel mezzo di QLinkedList
o modificare tutti o alcuni dei suoi elementi è possibile utilizzare gli stili iteratori stile Java o STL. Ecco un semplice esempio di come moltiplichiamo tutti gli elementi di QLinkedList
per 2:
QLinkedList<int> integerList {1, 2, 3};
QLinkedList<int>::iterator it;
for (it = integerList.begin(); it != integerList.end(); ++it)
{
*it *= 2;
}
QList
La classe QList
è una classe template che fornisce elenchi. Memorizza gli articoli in un elenco che fornisce accesso rapido basato su indice e inserzioni e rimozioni basate su indici.
Per inserire elementi nell'elenco, puoi utilizzare l' operator<<()
, insert()
, append()
o prepend()
. Per esempio:
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");
Per accedere all'elemento in una particolare posizione di indice, è possibile utilizzare l' operator[]()
o at()
. at()
può essere più veloce operator[]()
, non causa mai una copia profonda del contenitore e dovrebbe funzionare in tempo costante. Nessuno dei due controlla gli argomenti. Esempi:
if (list[0] == "mystring")
cout << "mystring found" << endl;
O
if (list.at(i) == "mystring")
cout << "mystring found at position " << i << endl;
Per rimuovere elementi, esistono funzioni come removeAt()
, takeAt()
, takeFirst()
, takeLast()
, removeFirst()
, removeLast()
o removeOne()
. Esempi:
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");
Per trovare tutte le occorrenze di un determinato valore in un elenco, è possibile utilizzare indexOf()
o lastIndexOf()
. Esempio:
indexOf()
int i = list.indexOf("mystring");
if (i != -1)
cout << "First occurrence of mystring is at position " << i << endl;