web-dev-qa-db-fra.com

Pourquoi utiliser QVector (Qt) au lieu de std :: vector

Je suis très nouveau en C++ et Qt, mais je suis très bon en C #/Java.

Le fait est que j'aime la multiplateforme, mais je suis confus avec Qt. std::vector n'est-il pas déjà multiplate-forme, Qt ne fournit-il pas un équivalent à une solution non multiplateforme?

Aussi, comment File et QFile sont-ils différents?

Un lien serait bien, merci :)

51
Athiwat Chunlakhan

Cet article est bon. Il compare la bibliothèque de modèles Qt avec la bibliothèque de modèles standard:

J'espère que vous trouverez cela intéressant de voir toutes les différences énumérées dans l'article.

MODIFIER:

Voici ce que je trouve intéressant:

Mon opinion est que le plus grand L’avantage du QTL est qu’il a même implémentation (y compris compatibilité binaire) sur tous les systèmes d'exploitation soutenu par Qt. Certains STL les implémentations peuvent être inférieures à la normale quand il s'agit de performance ou ils peut-être des fonctionnalités manquantes. Certains les plates-formes n'ont même pas de STL! Sur D'autre part, le STL est plus personnalisable et est disponible dans son intégralité dans les fichiers d’en-tête… Comme je l’ai dit, il n'y a pas de gagnant clair.

Comme il l'a dit, aucun gagnant clair. Mais continuer à lire cet article montre clairement beaucoup de choses. Il vaut mieux connaître la différence que d’en choisir un sans connaître l’autre.

42
Nawaz

La classe QVector est comptée en références et est conçue pour être partagée sans copier. Qt fournit un grand nombre de conteneurs correspondant aux conteneurs STL. Un document qui décrit ceux-ci avec une explication des internes et un peu de justification:

13
Michael Burr

De par ici :

Qt provient d'une époque où C++ et la bibliothèque standard n'était pas normalisé ou bien pris en charge par compilateurs. Il duplique donc un beaucoup de choses qui sont maintenant dans le bibliothèque standard, telle que des conteneurs et informations de type. Plus de manière significative, ils ont modifié le C++ langue pour fournir des signaux, de sorte que Les classes Qt ne peuvent pas être utilisées facilement avec classes non-Qt.

8
phimuemue

Le std::vector de C++ est multi-plateforme car il fait partie de la norme C++. Tout compilateur conforme à C++ doit le fournir.

Je ne connais pas bien Qt, mais j’ai vu ceci dans la documentation :

Remarque: Toutes les fonctions de cette classe sont réentrant.

Il est également probable (spéculation) que la classe QVector s'intègre plus facilement pour contenir des objets centrés sur Qt que std::vector. Encore une fois, je ne connais pas Qt, vous devez donc décider vous-même.

En règle générale (à de nombreuses exceptions près), j'aurais tendance à utiliser std::vector sauf si j'avais une raison impérieuse d'utiliser une classe de conteneur spécifique à la bibliothèque.

1
John Dibling

La mauvaise expérience que j'ai eue avec QTL était liée au fait que QTL n'a pas soulevé d'exception; Cela rend plus difficile la recherche et la correction des erreurs critiques. De plus, les implémentations de STL sont étroitement liées à un compilateur, car certaines parties de la bibliothèque nécessitent des extensions spécifiques au compilateur. Cela signifie qu'une implémentation STL peut souvent surpasser QTL, qui doit être portable et ne peut donc pas bénéficier desdites extensions. La question du débogage était critique pour moi cependant.

1
user1095108

Comme aucune réponse ne le mentionnait, les conteneurs Qt, y compris QVector, ont généralement une API plus complète, ce qui permet une certaine commodité supplémentaire et réduit le niveau de verbosité par rapport à std::vector.

QVector n'est pas vraiment intégré dans les API Qt, ce rôle est pris par inadapté QList; il n'est donc pas vraiment un argument solide pour utiliser QVector pour une meilleure compatibilité avec les API Qt. Notez que cela pourrait changer pour Qt 6, car les faiblesses de QList sont de plus en plus reconnues.

Ceci étant dit, si vous dépendez déjà de Qt pour votre application, il serait logique d'utiliser QVector pour plus de commodité. Je présume que personne ne va ajouter une dépendance aussi lourde que Qt juste pour un conteneur ou deux. QVector est efficace et performant, et fonctionnera sans problème sur n’importe quelle plate-forme, supportée par Qt. 

D'un autre côté, si vous souhaitez créer une API logique centrale indépendante du framework, il serait judicieux de le développer si possible en C++ standard, afin d'obtenir quelque chose de portable qui ne soit pas lié à un framework d'interface graphique particulier. vous pouvez facilement le migrer vers un autre à l'avenir si vous en avez besoin.

0
dtech