Question

J'ai un QVector de QVector. Et je veux collecter tous les éléments de tous les QVectors pour former un nouveau QVector.

Actuellement, j'utilise le code comme celui-ci

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

Mais il semble le operator+= est en fait ajouté chaque élément à la QVector. Il y a donc une utilisation plus efficace de temps de QVector ou un meilleur type approprié remplacer QVector?

Était-ce utile?

La solution

Si vous vraiment Besoin de faire, alors je ferais quelque chose comme:

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

Mais veuillez noter que cela ressemble un peu à une optimisation prématurée. Comme La documentation fait remarquer:

QVector essaie de réduire le nombre de réallocations en préalant jusqu'à deux fois plus de mémoire que les données réelles en ont besoin.

Alors ne faites pas ce genre de chose à moins que vous ne soyez vraiment sûr que cela améliorera vos performances. Restez simple (comme votre façon actuelle de le faire).

Modifier en réponse à votre exigence supplémentaire d'O (1):Eh bien, si vous insérez au hasard, c'est un liste liée Mais si vous avez juste ajouter (comme c'est tout ce que vous avez mentionné), vous avez déjà amorti O (1) avec le QVector. Jeter un coup d'œil à La documentation des conteneurs QT.

Autres conseils

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

Boucle extérieure: retirer chaque vecteur des vecteurs
Boucle intérieure: retirez chaque élément du vecteur i'th et poussez dans collecté

Vous pourriez utiliser Boost à plusieurs niveaux, cela fournit un tableau multidimensionnel.

Il s'agit également d'une bibliothèque «en-tête uniquement», vous n'avez donc pas besoin de compiler séparément une bibliothèque, de simplement déposer les en-têtes dans un dossier de votre projet et de les inclure.

Voir le lien pour le tutoriel et l'exemple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top