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;