Come ottenere un qvector da un qvector >?
Domanda
Ho un QVector di QVector.E voglio raccogliere tutti gli elementi in tutti i qvectors per formare un nuovo qvector.
Attualmente uso il codice come questo
QVector<QVector<T> > vectors;
// ...
QVector<T> collected;
for (int i = 0; i < vectors.size(); ++i) {
collected += vectors[i];
}
.
Ma sembra che il operator+=
stia effettivamente appendendo ogni elemento al QVector
.Quindi c'è un utilizzo più efficace di generatori di generatori di generazione o un tipo migliore adatto, sostituire QVector
?
Soluzione
Se tu davvero devi, allora farei qualcosa come:
.
QVector< QVector<T> > vectors = QVector< QVector<T> >();
int totalSize = 0;
for (int i = 0; i < vectors.size(); ++i)
totalSize += vectors.at(i).size();
QVector<T> collected;
collected.reserve(totalSize);
for (int i = 0; i < vectors.size(); ++i)
collected << vectors[i];
Ma si prega di notare che questo suona un po 'come l'ottimizzazione prematura. Come La documentazione sottolinea:
.QVector tenta di ridurre il numero di riallocazioni prefigendo fino a due volte più memoria delle esigenze effettive dei dati.
Quindi non fare questo genere di cose a meno che tu non sia davvero sicuro che migliorerà la tua performance. Tienilo semplice (come il tuo modo attuale di farlo).
Modifica in risposta al tuo requisito aggiuntivo di O (1): Bene, se stai inserendo a caso è un elenco collegato ma se Stai solo aggiungendo (come è tutto ciò che hai menzionato) hai già ammortizzato o (1) con il qvector. Dai un'occhiata a La documentazione per i contenitori QT .
Altri suggerimenti
for (int i = 0; i < vectors.size(); ++i) {
for(int k=0;k<vectors[i].size();k++){
collected.push_back(vectors[i][k]);
}
}
.
Loop esterno: Togli ogni vettore dai vettori Loop interno: estrai ogni elemento nel vettore I'th e spingere in raccolta
È possibile utilizzare boost multi-array , questo fornisce un array multidimensionale.