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 :

réinitialiser un vector dans une boucle


Sujet :

SL & STL C++

  1. #1
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut réinitialiser un vector dans une boucle

    J'utilise un vector pour effectuer du marquage sur les indices de mes éléments.
    J'ai l'ai donc initialiser avant ma boucle. Mais si je souhaite le réinitialiser dans ma boucle de façon à optimiser le marquage en effectuant une seule fois l'allocation dynamique, je ne sais pas si je dois utiliser la méthode clear ou la méthode resize.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    std::vector<bool> marked(nb_elements,0);
    for(int nb_tours=0;nb_tours<MAX_TOURS;nb_tours++)
    {
      for(int e = 0 ; e<nb_elements;e++ )
      {
        if(marked[e]) continue;
        /*...*/    
      }
      //réinitialisation du vector
      marked.clear();
      /*ou marked.resize(nb_elements,0) ? */
     
    }
    J'espère avoir été suffisament clair
    Quelqu'un à une idée ?
    Merci

  2. #2
    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 befalimpertinent Voir le message

    J'utilise un vector pour effectuer du marquage sur les indices de mes éléments.
    J'ai l'ai donc initialiser avant ma boucle. Mais si je souhaite le réinitialiser dans ma boucle de façon à optimiser le marquage en effectuant une seule fois l'allocation dynamique, je ne sais pas si je dois utiliser la méthode clear ou la méthode resize.

    J'espère avoir été suffisament clair
    Quelqu'un à une idée ?
    Merci
    Bonjour,
    si je ne me trompe pas :
    clear : remet a zéro le nombre d'élément et garde la mémoire
    resize : ré alloue la mémoire

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    La fonction clear() est équivalente à resize(0), c'est à dire qu'elle supprime tous les éléments du vecteur, sans désallouer la mémoire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::vector<bool> marked(nb_elements,0); // marked.size() == nb_elements
                                             // marked.capacity() == nb_elements
     
    marked.clear();                          // marked.size() == 0
                                             // marked.capacity() == nb_elements

  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 Sylvain Togni Voir le message
    La fonction clear() est équivalente à resize(0), c'est à dire qu'elle supprime tous les éléments du vecteur, sans désallouer la mémoire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::vector<bool> marked(nb_elements,0); // marked.size() == nb_elements
                                             // marked.capacity() == nb_elements
     
    marked.clear();                          // marked.size() == 0
                                             // marked.capacity() == nb_elements
    il faut donc faire
    marked.reserve(0) pour avoir une capacity ==0 ?

  5. #5
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    @Mongaulois : non, pour avoir une capacité nulle, il faut un swap avec un temporaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    marked.swap ( std::vector<bool>() );
    On échange le contenu avec un vecteur vide anonyme, et après le point-virgule, on a dépassé la durée de vie du vecteur anonyme qui contient maintenant le contenu précédent de "marked", donc il libère toute la mémoire.

  6. #6
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Mon code marche sans segfault en utilisant le clear mais je me méfie d'un éventuel comportement indéfini qui pourrait se produire en mode release (j'ai pas encore tester le mode release)

  7. #7
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Citation Envoyé par HanLee Voir le message
    Non, un swap avec un temporaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    marked.swap ( std::vector<bool>() );
    Mais là j'ai une nouvelle allocation dynamique à chaque tour. Non ?

  8. #8
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Citation Envoyé par befalimpertinent Voir le message
    Mais là j'ai une nouvelle allocation dynamique à chaque tour. Non ?
    Ah et pour ta question, ce n'est pas la mémoire qu'il faut vider désolé .

    Il faudrait remplir de false comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::fill(marked.begin(), marked.end(), false);

  9. #9
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    J'avais pas penser au fill et je crois que c'est ce que je vais utiliser. Au moins avec fill je suis sur de n'avoir ni réallocation ni comportement indéfini à ce niveau. Et point de vue sémantique il parait plus "logique" de devoir faire un fill(0) pour reseter le vector qu'un clear() ou qu'un resize().

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Remplissage d'un vector<> dans une boucle for
    Par syl1405 dans le forum C++
    Réponses: 13
    Dernier message: 26/07/2010, 11h01
  2. Remplissage de vector dans une boucle
    Par anasama dans le forum SL & STL
    Réponses: 6
    Dernier message: 02/01/2006, 09h07
  3. [Vb.net] Indexé un objet crée dans une boucle
    Par picpic dans le forum Windows Forms
    Réponses: 10
    Dernier message: 17/12/2003, 14h37
  4. Pause dans une boucle
    Par HT dans le forum Langage
    Réponses: 4
    Dernier message: 03/06/2003, 08h52

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