QVector vs QList
J'ai une liste de nombres entiers que j'ai besoin pour effectuer une itération sur, mais un tableau est insuffisante.
Quelles sont les différences entre vectors
et lists
et est-ce que je besoin de savoir avant de choisir un type?
Juste pour être clair, j'ai lu l'intervalle QT docs mais c'est la mesure de ce que je sais:
QList<T>
,QLinkedList<T>
, etQVector<T>
fournissent des fonctionnalités similaires. Voici un aperçu:
- Pour la plupart des fins,
QList
est le droit de la classe à utiliser. Son indice de base de l'API est plus pratique que deQLinkedList's
itérateur API, et il est généralement plus rapide queQVector
raison de la façon dont il stocke les éléments dans la mémoire. Il élargit également à moins de code dans votre fichier exécutable.- Si vous avez besoin d'un réel lié liste, avec les garanties de la constante de temps insertions dans le milieu de la liste et les itérateurs d'éléments plutôt que de les index, utilisez
QLinkedList
.- Si vous voulez que les éléments d'occuper adjacentes positions de mémoire, utilisez
QVector
.
InformationsquelleAutor jcuenod | 2011-07-06
Vous devez vous connecter pour publier un commentaire.
QVector
est essentiellement analogue àstd::vector
, comme vous pouvez le deviner à partir du nom.QList
est plus proche deboost::ptr_deque
, en dépit de l'apparente association avecstd::list
. Il ne permet pas de stocker des objets directement, mais au lieu stocke des pointeurs vers eux. Vous obtenir tous les avantages d'une insertion rapide aux deux extrémités, et les réallocations d'impliquer brassage des pointeurs au lieu de copier les constructeurs, mais perdre de l'espace de la localité destd::deque
oustd::vector
, et de gagner beaucoup de tas allocations. Elle a quelques prise de décision pour éviter le tas allocations pour les petits objets, retrouver l'espace d'une localité, mais ce que je comprends, il ne s'applique qu'à des choses plus petite qu'uneint
.QLinkedList
est analogue àstd::list
, et a tous les inconvénients d'elle. De manière générale, ce devrait être votre dernier choix d'un conteneur.De la bibliothèque QT est très favorable à l'utilisation de
QList
objets, afin de favoriser entre eux dans votre propre code peut parfois éviter certaines inutile de l'ennui. Le supplément de l'utilisation du tas et le positionnement aléatoire des données réelles peuvent théoriquement mal dans certaines circonstances, mais il est unnoticable. Alors je vous suggérons d'utiliserQList
jusqu'à ce que le profilage suggère de changer deQVector
. Si vous vous attendez allocation contiguë à être importante [lire: vous êtes l'interfaçage avec du code qui s'attend à unT[]
au lieu d'unQList<T>
] qui peut également être une raison pour commencer avecQVector
droit au large de la chauve-souris.Si vous vous posez des questions à propos des contenants en général, et de l'utilisation de l'intervalle QT documents de référence, les informations ci-dessus est moins utile.
Un
std::vector
est un tableau que vous pouvez redimensionner. Tous les éléments sont stockés les uns à côté des autres, et vous pouvez accéder aux éléments individuels rapidement. L'inconvénient est que les insertions ne sont efficaces à une extrémité. Si vous mettez quelque chose dans le milieu, ou au début, vous devez copier les autres objets pour faire de la place. En grande-oh notation, à l'insertion, à la fin est O(1), l'insertion n'importe où ailleurs est O(N), et un accès aléatoire est O(1).Un
std::deque
est similaire, mais ne permet pas de garantir les objets sont stockés les uns à côté des autres, et permet d'insertion aux deux extrémités à O(1). Il exige également de plus petits morceaux de mémoire allouée à un moment, ce qui peut parfois être important. D'accès aléatoire est O(1) et l'insertion dans le milieu est O(N), de même pour unvector
. Spatiales de la localité est pire questd::vector
, mais les objets ont tendance à être regroupés de sorte que vous acquérir une certaine avantages.Un
std::list
est une liste liée. Il nécessite le plus de surcharge de la mémoire de trois dans l'ordre des conteneurs, mais offre rapide d'insertion n'importe où... à condition de savoir à l'avance où vous souhaitez insérer. Il n'offre pas d'accès aléatoire à des éléments individuels, de sorte que vous avez à effectuer une itération en temps O(N). Mais une fois là-bas, l'insertion est O(1). Le plus grand avantage destd::list
est que vous pouvez épissure ensemble rapidement... si vous déplacez l'ensemble d'une gamme de valeurs à un autrestd::list
, l'ensemble de l'opération est O(1). Il est également beaucoup plus difficile d'invalider les références dans la liste, ce qui peut parfois être important.En règle générale, je préfère
std::deque
àstd::vector
, à moins que j'ai besoin d'être en mesure de transmettre les données à une bibliothèque qui s'attend à un raw tableau.std::vector
est garanti contiguë, de sorte&v[0]
travaux à cet effet. Je ne me souviens pas la dernière fois que j'ai utilisé unstd::list
, mais il a été presque certainement parce que j'avais besoin de la plus forte guaretee à propos des références restant valables.std::deque
contrestd::vector
? Vous allez être surpris...Les choses ont changé
Nous sommes maintenant dans Qt 5.8 et les choses ont changé, de sorte que la documentation. Il donne une vision claire et réponse différente à cette question :
Dans
QVector
est similaire àstd::vector
.QLinkedList
est similaire àstd::list
.QList
est un indice vectoriel, mais la position de la mémoire n'est pas garanti (commestd::deque
).De QtList doc:
QList à être utilisé dans la plupart des cas. Pour les structures avec un millier d'articles, facilite l'insertion dans le milieu, et fournit indexées accès.
prepend()
etappend()
très vite, puisque la mémoire est préaffectés aux deux extrémités du tableau interne.QList<T>
est un tableau de pointeur de type T. Si T est un pointeur ou Qt partagée-comme pointeur de type, de l'objet est stocké directement dans la gammeQVector
à privilégier dans le cas d'un lot deappend()
ouinsert()
de nouveaux éléments avec une taille supérieure à un pointeur depuisQVector
alloue de la mémoire pour ses articles en un seul tas de répartition. PourQList
, insérez d'ajouter un nouveau point exige l'allocation de mémoire de la nouvelle rubrique sur le tas. En bref, si vous voulez que les éléments d'occuper adjacentes positions de mémoire, ou si vos articles sont plus grands qu'un pointeur et que vous voulez éviter la surcharge de l'allocation sur le tas individuellement au moment de l'insertion, puis utilisezQVector
.QVector
est comme un tableau qui peut changer de taille (augmentation ou diminution), mais il est livré avec de lourdes opérations et le calcul et le temps.Par exemple, si vous souhaitez ajouter un élément, un nouveau tableau est créé, tous les éléments sont copiés dans le nouveau tableau, le nouvel élément est ajouté à la fin, et ancien tableau est supprimé. Et vice versa pour supprimer ainsi.
Cependant,
QLinkedList
travaille avec des pointeurs. Ainsi, lorsqu'un nouvel élément est créé, juste un nouvel espace mémoire est alloué et lié à la seule partie de la mémoire. Depuis, il travaille avec des pointeurs, il est plus rapide et efficace.Si vous avez la liste des éléments que vous ne vous attendez pas à changer de taille beaucoup,
QVector
est probablement une bonne chose, mais généralementQLinkedList
est utilisé pour la plupart des besoins.