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

SL & STL C++ Discussion :

[STL] std::deque, reserve() ?


Sujet :

SL & STL C++

  1. #1
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut [STL] std::deque, reserve() ?
    Je cherche l'équivalent de la méthode reserve() de std::vector mais pour deque (et queue). Je ne la trouve pas...
    Merci.

  2. #2
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut
    dans quel but ?

    gagner du temps d'execution en allouant dès le debut de la memoire ?

    pour la gestion de la memoire (system embarqué) ?

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Oui, c'est l'évidence même...

    J'use et abuse de la méthode reserve() de std::vector quand je connais à l'avance le nombre d'éléments à traiter ou quand je peux en faire une estimation assez précise. Ça évite une fragmentation inutile de la mémoire (sans compter les allocations/désallocations avec les copies d'objets que cela implique, etc).

    Je m'étonne de ne pas trouver d'équivalent dans std::queue et std::deque.

    Une telle méthode existe-elle ?

  4. #4
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    pour les vecteurs la méthode reserve() est utile car la mémoire n'est pas fragmentée, c'est un bloc qu'il faudrait réallouer entièrement à chaque changement de taille.

    Pour ta queue, les différents objets n'ont pas besoin d'être côte à côte et faire une nouvelle allocation avant ou après ne change vraiment pas grand chose car il faudra faire autant d'allocations, car une allocation = un objet. (pour les vecteurs une allocation = tous les objets)

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Si reserve a un intéret dans le cadre des vector, c'est parce qu'ils sont basés sur un tableau C style ( ex: int mbr[10], int ptr*= new int[10]), meme si c'est transparent pour l'utilisateur, ce qui fait que les différents éléments sont placés dans des espaces contigus de la mémoire.

    Cela permet donc de dire, dés le départ "je prévois d'avoir (n) éléments dans mon tableau", et d'éviter le problème de la réallocation de la mémoire tant que l'on n'a pas atteind le (n-1)eme élément.

    Par contre la deque fnoctionne plutot sur le principe d'une "structure dynamique", ou, si tu préfères, d'une structure dans laquelle chaque élément dispose d'un pointeur vers l'élément précédent/suivant.

    L'espace mémoire utilisé par les différents éléments ne doit donc pas etre contigu, vu qu'il est alloué "au premier endroit où on trouve un espace suffisant pour faire tenir l'élément"

    Simplement, afin de permettre un ajout en temps constant à la fin de la liste (en évitant de devoir reparcourrir l'ensemble des élément), la deque maintient également un pointeur sur le dernier élément qu'elle contient

    Il n'y a donc aucune raison de vouloir réserver de l'espace pour les différents éléments qu'elle contient, et, c'est la raison pour laquelle la méthode reserve n'existe purement et simplement pas
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par koala01
    Par contre la deque fnoctionne plutot sur le principe d'une "structure dynamique", ou, si tu préfères, d'une structure dans laquelle chaque élément dispose d'un pointeur vers l'élément précédent/suivant.
    Ne confondrais-tu pas avec std::list ?

    Je vois plus un deque comme une liste de tableaux de taille fixe.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    OK, merci pour vos réponses.
    C'est l'implémentation de std::queue qui me parait lourde. Je pense qu'elle aurait pu être plus simple et basée sur std::vector au lieu de std::deque.

    Vu la simplicité de mes besoins (std::queue<unsigned>), j'en ferai une implémentation moi-même si nécessaire.

    Merci encore.

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Tu veux un std::queue basé sur un std::vector ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::queue<T, std::vector<T> >
    Mais std::vector sera moins efficace, car une file nécessite des opérations en début de séquence, ce qui entraîne une recopie de tout le tableau dans le cas d'un std::vector.

  9. #9
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    La solution donnée par Laurent est ce que tu désires, seulement comme il l'a dit cela sera très lourd, donc à n'utiliser que si tu n'as pas besoin de rapidité.

  10. #10
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Sinon, je me demande: si tu connais à l'avance la taille de ton conteneur (enfin, le nombre d'éléments qu'il va contenir), et que les problèmes de performances semblent si contraignantes, pourquoi ne pas utiliser un simple vector alloué une bonne fois pour toute, et puis tu le parcours avec un itérateur que tu garde en mémoire quelque part pour ne pas avoir à re-parcourir ton tableau à chaque fois?

  11. #11
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Citation Envoyé par Laurent Gomila
    Tu veux un std::queue basé sur un std::vector ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::queue<T, std::vector<T> >
    Non, je veux une (autre) queue basée sur un std::vector, puisque std::queue me semble trop lourde pour mes besoins.
    Citation Envoyé par Laurent Gomila
    Mais std::vector sera moins efficace, car une file nécessite des opérations en début de séquence, ce qui entraîne une recopie de tout le tableau dans le cas d'un std::vector.
    En effet, une recopie sera nécessaire de temps en temps, mais uniquement lorsqu'il faudra réalouer de l'espace mémoire.
    Deux indices sur std::vector, en plus de std::vector lui-même, sont suffisants pour faire une queue: un pour le début de la queue et un pour la fin, l'indice de fin pouvant être inférieur à celui de début (std::vector pouvant être vu comme une liste circulaire, l'élément d'indice 0 étant le suivant de celui d'indice N-1, s'il y a N éléments).

Discussions similaires

  1. [STL std::map] element precedant
    Par ZaaN dans le forum SL & STL
    Réponses: 1
    Dernier message: 17/05/2007, 00h52
  2. STL, std::vector et SSE2
    Par mat087 dans le forum SL & STL
    Réponses: 9
    Dernier message: 24/03/2007, 23h04
  3. template, héritage et std:deque
    Par jmtrivial dans le forum Langage
    Réponses: 7
    Dernier message: 27/09/2006, 15h08
  4. [STL]std::map<std::string, structure> Parcour...
    Par Zenol dans le forum SL & STL
    Réponses: 5
    Dernier message: 11/02/2006, 13h46
  5. STL : std::set problème avec insert ...
    Par Big K. dans le forum MFC
    Réponses: 13
    Dernier message: 08/11/2003, 01h02

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