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

C++ Discussion :

Vector iterator incompatible


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2021
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2021
    Messages : 7
    Points : 7
    Points
    7
    Par défaut Vector iterator incompatible
    Bonsoir,

    J'ai un problème concernant ce programme : Nom : 28imG.png
Affichages : 373
Taille : 33,9 Ko

    J'aimerais comprendre pourquoi le while sur la liste L fonctionne correctement alors que celui avec le vecteur V ne fonctionne pas. Sachant que les deux codes sont "identiques", je ne vois vraiment pas pourquoi il y a un problème de compatibilité.

    Le contexte : J'ai une liste L et un vecteur V et j'aimerais transférer toutes les filles de la liste et du vecteur vers un nouveau vecteur TD.

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    C'est ultra logique
    std::vector::erase, documentation cplusplus.com en anglais

    1 vecteur est 1 stockage contiguë en mémoire. Donc s'il y a reallocation, tes itérateurs sont invalides.
    1 liste chaînée ce sont des maillons avec 1 système de pointeurs "suivant"/ "précédent" (<- lire la documentation std::list::erase pour confirmer)

  3. #3
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    L'objet list<> est en effet une des rares collections qui peut être parcourue et modifiée en même temps.

    On peut cependant le faire sur les vector<> par une toute petite modification de ton code (la fonction erase() retourne quelque chose à utiliser). Mais je ne peux pas agir sur une copie d'écran.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2021
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2021
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Merci pour vos réponses.

    voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	itV = V.begin();
    	while (itV != V.end())
    	{
    		if ((*itV).get_sexe() == 'F')
    		{
    			TD.push_back(*itV); itTEMP2 = itV;
    			itV++;
    			V.erase(itTEMP2);
    		}
    		else { itV++; }
    	}
    Que dois-changer pour que ça fonctionne?
    Merci d'avance.

  5. #5
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        itV = V.begin();
        while ( itV != V.end() ) {
            if ( itV->get_sexe() == 'F' ) {
                TD.push_back( *itV );
                itV = V.erase( itV );  // erase retourne le prochain iterateur, et il est garanti valide
            }
            else {
                ++itV;
            }
        }

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2021
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2021
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Merci beaucoup !

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Très bon exercice d'utilisation de std::stable_partition et std::move.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    auto firstExtract = std::stable_partition(L.begin(), L.end(), [](const Etudiant& e){ return e.get_sexe() != 'F'; }); // Tous les étudiants avec get_sexe == F seront après firstExtract
    TD.resize(std::distance(firstExtract, L.end()));
    std::move(firstExtract, L.end(), TD.begin());
    L.erase(firstExtract, L.end());
    https://www.developpez.net/forums/bl...tion-initiale/
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

Discussions similaires

  1. vector : iterator.. besoins d'une petite précision
    Par italiasky dans le forum SL & STL
    Réponses: 2
    Dernier message: 18/11/2008, 10h37
  2. Réponses: 10
    Dernier message: 30/06/2008, 19h59
  3. pair, vector, iterator et type_traits
    Par NiamorH dans le forum SL & STL
    Réponses: 7
    Dernier message: 21/02/2008, 18h56
  4. Réponses: 2
    Dernier message: 07/12/2007, 02h19
  5. Template - vector - iterator
    Par jmeuf dans le forum Langage
    Réponses: 6
    Dernier message: 30/03/2007, 13h42

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