195 votes

Conteneurs STL ou Qt?

Quels sont les avantages et les inconvénients de l'utilisation de Qt conteneurs (QMap, QVector, etc.) au cours de leur STL équivalent?

Je peux voir une raison de préférer Qt:

  • Qt, les conteneurs peuvent être transmis à d'autres parties de l'intervalle Qt. Par exemple, ils peuvent être utilisés pour remplir un QVariant puis un QSettings (avec une limitation cependant, que d' QList et QMap/QHash dont les clés sont des chaînes de caractères sont acceptés).

Est-il un autre?

Edit: en Supposant que l'application s'appuie déjà sur l'intervalle Qt.

189voto

Doug T. Points 33360

C'est une question difficile à répondre à la question. Il peut vraiment se résument à une philosophique/subjectif argument.

Cela étant dit...

Je recommande la règle "à Rome... Faites comme les Romains"

Ce qui signifie que si vous êtes dans Qt terres, code de l'intervalle Qt'ians faire. Ce n'est pas seulement pour des raisons de lisibilité et la cohérence des préoccupations. Examinons ce qui se passe si vous stocker le tout dans un conteneur stl ensuite vous devez passer toutes les données sur un Qt fonction. Voulez-vous vraiment à gérer un tas de code que des copies des choses dans/hors de l'intervalle Qt conteneurs. Votre code est déjà fortement dépendante sur l'intervalle Qt, donc ce n'est pas comme vous êtes en rendant plus "standard" en utilisant des conteneurs stl. Et quel est le point d'un conteneur si à chaque fois que vous souhaitez l'utiliser pour quoi que ce soit utile, vous devez le copier dans le Qt conteneur?

141voto

rpg Points 5305

J'ai commencé par utiliser std::(w)de la chaîne et les conteneurs STL exclusivement et en le convertissant vers/à partir de l'intervalle Qt équivalents, mais j'ai déjà changé pour QString et je trouve que je suis en utilisant Qt sur les contenants de plus en plus.

Quand il s'agit de chaînes de caractères, QString offre beaucoup plus de fonctionnalités complètes par rapport à std::basic_string et il est complètement conscient unicode. Il propose également une efficace mise en œuvre de la VACHE, que j'ai appris à compter sur la très.

Qt sur les conteneurs:

  • offrir la même VACHE mise en œuvre comme dans QString, ce qui est extrêmement utile lorsqu'il s'agit de l'utilisation de Qt foreach macro (une copie) et lors de l'utilisation de metatypes ou les signaux et les slots.
  • pouvez utiliser la STL style itérateurs ou Java-les itérateurs de style
  • sont diffusables avec QDataStream
  • sont largement utilisés dans l'API de Qt
  • avoir une version stable de la mise en œuvre à travers des systèmes d'exploitation. Un STL mise en œuvre doit obéir à la norme C++, mais est par ailleurs libre de faire comme il lui plaît (voir le std::string VACHE controverse). Certains STL implémentations sont particulièrement mauvais.
  • fournir des tables de hachage, qui ne sont pas disponibles, sauf si vous utilisez TR1

Le QTL a une philosophie différente de la STL, qui est bien résumée par J. Blanchette: "Considérant que la STL conteneurs sont optimisés pour la vitesse brute, Qt sur les classes de conteneurs ont été soigneusement conçu pour fournir la commodité, le minimum de l'utilisation de la mémoire, et un minimum de code d'extension."
Le lien ci-dessus fournit plus de détails sur la mise en œuvre du QTL et que les optimisations sont utilisés.

74voto

Marc Mutz - mmutz Points 10367

L'intervalle Qt conteneurs sont plus limités que ceux de la STL. Quelques exemples de cas où les STL sont de qualité supérieure (tous ces j'ai frappé dans le passé):

  • STL est standardisé, ne change pas à chaque Qt version (Qt 2 a QList (pointeur) QValueList (de la valeur); Qt 3 a QPtrList et QValueList; Qt 4 a QList, et il n'est rien du tout comme QPtrList ou QValueList).
    Même si vous vous retrouvez à l'aide de l'intervalle Qt conteneurs, l'utilisation de la STL-compatible API sous-ensemble (ie. push_back(), pas append(); front(), pas first(), ...) pour éviter le portage encore une fois venir Qt 5. Dans les deux Qt2->3 et Qt3->4 transitions, les changements dans les conteneurs Qt ont été parmi ceux qui nécessitent le plus de code de désabonnement.
  • STL bidirectionnel conteneurs ont tous rbegin()/rend(), faisant d'itération inverse symétrique à l'avant de l'itération. Qt conteneurs n'ont pas une telle chose, alors inverser l'itération est inutilement compliqué.
  • STL, les algorithmes de gamme-insert() de différent, mais compatibles, des types iterator, rendant std::copy() beaucoup moins souvent nécessaire.
  • Des conteneurs STL ont un Allocator argument de modèle, de fabrication personnalisée de gestion de la mémoire trivial (typedef nécessaire), par rapport à Qt (fourchette de QLineEdit requis pour l' s/QString/secqstring/).
  • Il n'y a pas de Qt équivalent à std::deque.
  • std::list a splice(). Chaque fois que je me retrouve à l'aide de std::list, c'est parce que j'ai besoin d' splice().
  • std::stack, std::queue correctement globale de leur conteneur sous-jacent, et de ne pas en hériter, QStack, QQueue le faire.
  • QSet , c'est comme std::unordered_set, pas comme std::set.
  • QList est juste bizarre.

Beaucoup de ce qui précède pourrait être résolu très facilement en Qt, mais le conteneur de la bibliothèque Qt semble souffrir d'un manque de concentration sur le développement à l'heure actuelle.

24voto

fbrereto Points 21711

Conteneurs STL:

  • Avoir des garanties de performance
  • Peut être utilisé dans les algorithmes STL qui ont également des garanties de performance
  • Peut être utilisé par des bibliothèques C ++ tierces telles que Boost
  • Sont standard et susceptibles de survivre aux solutions propriétaires
  • Encourager la programmation générique d'algorithmes et de structures de données. Si vous écrivez de nouveaux algorithmes et structures de données conformes à la norme STL, vous pouvez tirer parti de ce que STL fournit déjà sans frais.

14voto

TimW Points 5715

Les conteneurs Qt utilisent un idiome de copie sur écriture.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X