Frage

Ich habe einen QVector von QVector.Und ich möchte alle Elemente in allen QVectors sammeln, um einen neuen QVector zu bilden.

Momentan benutze ich den Code so

QVector<QVector<T> > vectors;
// ...
QVector<T> collected;
for (int i = 0; i < vectors.size(); ++i) {
     collected += vectors[i];
}

Aber es scheint die operator+= hängt tatsächlich jedes Element an das an QVector.Gibt es also eine zeiteffizientere Nutzung von QVector oder einen besser geeigneten Typ ersetzen QVector?

War es hilfreich?

Lösung

Wenn Sie wirklich muss, dann würde ich so etwas machen wie:

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];

Aber bitte beachten Sie, dass dies ein bisschen nach vorzeitiger Optimierung klingt.Als Dokumentation hinweisen:

QVector versucht, die Anzahl der Neuzuweisungen zu reduzieren, indem bis zu doppelt so viel Speicher vorbelegt wird, wie die tatsächlichen Daten benötigen.

Machen Sie so etwas also nur, wenn Sie wirklich sicher sind, dass es Ihre Leistung verbessert.Halten Sie es einfach (wie Ihre derzeitige Vorgehensweise).

Bearbeiten Sie als Antwort auf Ihre zusätzliche Anforderung von O (1): Nun, wenn Sie zufällig einfügen, ist es ein Linkliste aber wenn Sie nur anhängen (wie das alles ist, was Sie erwähnt haben), haben Sie bereits O (1) mit dem QVector amortisiert.Werfen Sie einen Blick auf die Dokumentation für Qt-Container.

Andere Tipps

for (int i = 0; i < vectors.size(); ++i) {
    for(int k=0;k<vectors[i].size();k++){
        collected.push_back(vectors[i][k]);
    }
}

äußere Schleife:nehmen Sie jeden Vektor aus Vektoren heraus
innere Schlaufe:nehmen Sie jedes Element im i. Vektor heraus und schieben Sie es in collected

Sie könnten verwenden Steigern Sie Multi-Array, dies liefert ein mehrdimensionales Array.

Es ist auch eine reine Header-Bibliothek, sodass Sie eine Bibliothek nicht separat kompilieren müssen. Legen Sie einfach die Header in einem Ordner in Ihrem Projekt ab und fügen Sie sie ein.

Siehe den Link für das Tutorial und das Beispiel.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top