IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

QList versus QVector ?


Sujet :

Qt

  1. #1
    Invité
    Invité(e)
    Par défaut QList versus QVector ?
    Salut à tous, j'aimerais savoir quelles sont les différences entre les deux conteneurs personnalisé de Qt : QList, et QVector.

    J'aimerais aussi savoir, si il existe une classe (pas nécessairement Template) dans Qt, permettant de manipuler les données dans comme dans un tableau 2D. Dans le cas contraire, quel est la classe entre les deux précédentes, le plus adapté pour ce cas de figure. Merci à vous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    typedef QList< QList< T > > Table2DOfType;
    typedef QVector< QVector< T > > Table2DOfType;

  2. #2
    Rédacteur

    Avatar de johnlamericain
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    3 742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 3 742
    Par défaut
    La définition de la doc te suffit pas ?

    Citation Envoyé par Doc Qt
    QVector<T> is one of Qt's generic container classes. It stores its items in adjacent memory locations and provides fast index-based access.

    QList<T>, QLinkedList<T>, and QVarLengthArray<T> provide similar functionality. Here's an overview:

    * For most purposes, QList is the right class to use. Operations like prepend() and insert() are usually faster than with QVector because of the way QList stores its items in memory (see Algorithmic Complexity for details), and its index-based API is more convenient than QLinkedList's iterator-based API. It also expands to less code in your executable.
    * If you need a real linked list, with guarantees of constant time insertions in the middle of the list and iterators to items rather than indexes, use QLinkedList.
    * If you want the items to occupy adjacent memory positions, or if your items are larger than a pointer and you want to avoid the overhead of allocating them on the heap individually at insertion time, then use QVector.
    * If you want a low-level variable-size array, QVarLengthArray may be sufficient.

  3. #3
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 33
    Par défaut
    Salut,
    voici un extrait de la documentation de QList tiré du DOC QT4.6:
    For most purposes, QList is the right class to use. Its index-based API is more convenient than QLinkedList's iterator-based API, and it is usually faster than QVector because of the way it stores its items in memory. It also expands to less code in your executable.
    ...si tu as bien compris,QList est plus générale dans tous les cas et plus rapide que QVector...
    a propos d'autres classes similaire aux tableaux 2D ,il existe QVarLengthArray pour les tableaux à taille faible et variable,mais il utilise les templates...
    j'éspére que ça va t'aider!

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Abdelite Voir le message
    Dans le cas contraire, quel est la classe entre les deux précédentes, le plus adapté pour ce cas de figure.
    aucune des deux....
    Si c'est un tableau 2D, c'est que chaque ligne à la même taille.
    Il est beaucoup plus intéressant (et sûr) de faire un tableau 1D et de jouer sur le id

    QVarLengthArray est un tableau 1D.

  5. #5
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 33
    Par défaut
    Ah oui,désolé,QVarLengthArray est un tableau 1D pas 2D...j'ai commit une faute
    d'orthographe!

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Ou tu fais une QList<QList<int>> de taille 2, avec la liste une pour les "x", et la liste 2 pour les "y".

    Sinon, il me semble que ça existe dans Qwt, tu peux regarder comment ils ont fait.
    EDIT : Dans Qwt, en fait, il y a juste une classe avec deux QVector membre.

    G.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Merci pour vos réponses, pour le tableau 2D, je peux faire comme Qwt mais au lieu d'utiliser des QVector, j'utilise des QList, qui sont un peu plus rapide. Ça peux sembler correct, quels sont vos avis ?

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut

    qu'es ce que tu appel un tableau2D au finale??

  9. #9
    Invité
    Invité(e)
    Par défaut
    Un exemple de ce que j'appelle un tableau 2D :

    Un tableau de tableau comme : *argv[]

  10. #10
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Merci pour vos réponses, pour le tableau 2D, je peux faire comme Qwt mais au lieu d'utiliser des QVector, j'utilise des QList, qui sont un peu plus rapide. Ça peux sembler correct, quels sont vos avis ?
    Ca depend, si tes données sont amenées à être utilisées sous forme de tableaux "C", alors il faut mieux utiliser des QVector. Sinon tu seras obligé de passer tes QList en QVector puis en tableaux "C", donc le peu de temps que tu gagneras à la manipulation de ta Qlist sera vite perdu.

    Et puis je crois que si tu utilise la methode "reserve(int)" de QVector pour réserver une taille suffisante au préalable, les performances sont équivalentes.

    G.

  11. #11
    Membre éprouvé
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Par défaut
    Je pense que ça dépend surtout de l'utilisation que tu en fais, si la taille de ta matrice (tableau 2D) est amenée à changer souvent ou pas du tout, si tu vas plutôt parcourir les éléments des tableaux dans l'ordre ou y accéder aléatoirement etc.
    Je pense qu'une matrice de taille fixe sera optimale avec un tableau de tableaux directement en C++ sans classe conteneur. Sinon la doc Qt dit bien quelle structure utiliser selon ses besoins.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Ok, merci pour vos précision, je vais créer ma propre classe avec des QList.

  13. #13
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Je pense qu'une matrice de taille fixe sera optimale avec un tableau de tableaux directement en C++ sans classe conteneur.
    Le problème est la gestion de la mémoire (qu'il faut gérer soit même) et l'accès aux données (il faut alors utiliser des pointeurs bruts, avec les risques associés)

    Je pense que ça dépend surtout de l'utilisation que tu en fais
    D'accord à 100%
    Qlist est un tableau de pointeur. Lors d'une opération de recopie, tu ne recopies que les pointeurs et pas les objets eux-même. Si tu as une QList de type complexe, c'est très intéressant.

    Par contre, si tu utilises un type simple (char, double...), il n'y a plus aucun intérêt. C'est la cas par exemple des matrices et des heighmaps (tableau 2d de double de taille fixe en général). Dans ce cas, il vaut mieux créer un vecteur de dimension ligne*colonne et de créer les accésseurs qui vont bien (begin, end, begin_colonne, begin_ligne, begin_ligne, end_ligne, next_ligne, next_colonne, operator(x,y)...) de type STL-like

  14. #14
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    Qlist est un tableau de pointeur. Lors d'une opération de recopie, tu ne recopies que les pointeurs et pas les objets eux-même. Si tu as une QList de type complexe, c'est très intéressant.
    QList a pourtant un constructeur de copie qui recréer aussi les objets contenus, et non les pointeurs, je ne me trompe pas ?

    Citation Envoyé par gbdivers Voir le message
    Par contre, si tu utilises un type simple (char, double...), il n'y a plus aucun intérêt. C'est la cas par exemple des matrices et des heighmaps (tableau 2d de double de taille fixe en général). Dans ce cas, il vaut mieux créer un vecteur de dimension ligne*colonne et de créer les accésseurs qui vont bien (begin, end, begin_colonne, begin_ligne, begin_ligne, end_ligne, next_ligne, next_colonne, operator(x,y)...) de type STL-like
    Oui, mais c'est la taille fixe qui me gène, il n'y a pas un moyen pour avoir un tableau bidimensionnel à taille variable ? Je pensai que les QList suffisaient...

  15. #15
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Les objets ne sont recopiés que lors du premier accès en écriture aux données (système COW).

    Je pensais en particulier aux recopies lors des redimenssionment des vectors (si la nouvelle taille dépasse la taille resrvée) : on commence par créer un nouveau bloc mémoire de taille suffisante puis on recopie tous les éléments (des pointeurs dans le cas d'une QList, des objets dans le cas d'un vecteur).
    C'est pour ça que lorsque l'on veut insérer beaucoup d'élément dans un std::vector (par exemple une boucle qui insère 100000 éléments à l'aide de push_back), on commence par faire un vector::reserve(size) pour ne pas refaire une réallocation mémoire avec copie à chaque push_back.
    Et c'est pour ça que les std::list et autre sont plus efficace pour les opérations d'insertion/deletion/resize (implémenté en liste chainée)

    Quand je parle de taille fixe, c'est que les opérations de resize sont souvent couteuse en temps, donc on évite de redimenssionner toute les 2 lignes. Mais la taille peut varier lors de l'execution.
    C'est la cas d'une heighmap qui peut changer au cours du temps (en fonction de la résolution ou lors d'un resize de la fenêtre) mais les calculs sont fait sur une matrice de taille fixe (comprendre "fixe durant la phase de calcul")

    Ca te laisse un 3eme type de conteneur à coder... basé sur les listes chainées (1 objet pointé = 1 cellule avec des pointeurs vers les éléments suivant)

  16. #16
    Invité
    Invité(e)
    Par défaut
    Merci pour ta réponse, je vais faire un petit tri et m'y mettre

  17. #17
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    Par contre, si tu utilises un type simple (char, double...), il n'y a plus aucun intérêt.
    Dans ce cas QList == QVector

  18. #18
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Dans ce cas QList == QVector
    Pas exactement puisque QList est un tableau de pointeur alors que QVector est un tableau.
    Ce qui fait que pour QList, la mémoire occupée est plus grande (sizeof(T)+sizeof(void*) vs sizeof(T) pour QVector) et l'accès neccessite un déréfrencement du pointeur. Dans le cas de grands tableaux (et dans l'embarqué ou les portables), cette différence peut être importante

  19. #19
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    Pas exactement puisque QList est un tableau de pointeur alors que QVector est un tableau.
    Ce qui fait que pour QList, la mémoire occupée est plus grande (sizeof(T)+sizeof(void*) vs sizeof(T) pour QVector) et l'accès neccessite un déréfrencement du pointeur. Dans le cas de grands tableaux (et dans l'embarqué ou les portables), cette différence peut être importante
    Internally, QList<T> is represented as an array of pointers to items of type T. If T is itself a pointer type or a basic type that is no larger than a pointer, or if T is one of Qt's shared classes, then QList<T> stores the items directly in the pointer array.
    j'ai un doute maintenant c'est soit
    sizeof(void*) vs sizeof(T) soit la même choses.
    Mais ce n'est pas sizeof(T)+sizeof(void*) vs sizeof(T)

  20. #20
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    C'est bien un tableau de taille n*sizeof(void*) pour QList et n*sizeof(T) pour QVector. De plus, pour QList, les pointeurs pointent vers des objets T de taille sizeof(T). Donc on a bien une taille totale de n*(sizeof(void*)+sizeof(T)) pour QList (mais effectivement qu'un tableau de taille n*sizeof(void*))

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Débat] MERISE versus UML ? Avenir de MERISE ?
    Par Matthieu Brucher dans le forum Méthodes
    Réponses: 51
    Dernier message: 15/02/2022, 17h32
  2. C# versus Java
    Par laffreuxthomas dans le forum C#
    Réponses: 368
    Dernier message: 30/03/2019, 22h59
  3. QVector, QList, std::vector
    Par palador dans le forum Débuter
    Réponses: 2
    Dernier message: 12/10/2012, 23h54
  4. Utilisation de QList ou de QVector pour un Sudoku ?
    Par mrdus dans le forum Débuter
    Réponses: 6
    Dernier message: 13/05/2010, 15h00
  5. Que choisir : PHP versus Java ?
    Par Sniper37 dans le forum Général Conception Web
    Réponses: 164
    Dernier message: 28/04/2009, 16h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo