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 :

replace dans une boucle


Sujet :

SL & STL C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 86
    Points : 70
    Points
    70
    Par défaut replace dans une boucle
    Bonjour,

    Voilà, j'utilise la fonction replace dans une boucle for. Lors du premier passage, tout est bon, mais pour le deuxième, rien ne va plus...

    Voici un code d'exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    vector<int> v;
    for (int i=0;i<5;i++){
        v.push_back(i);
    }
    for (int j=0;j<v.size();j++){
        replace(v.begin();v.end(),v[j],j+1);
    }
    J'ai bien testé les valeurs du tableau et celles que je veux remplacer, et là je ne vois pas pourquoi ça ne fonctionne pas. Est-ce que replace modifie le tableau (et donc v.begin et v.end sont modifiés)?

    Merci!

  2. #2
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    "Rien ne va plus", ça veut dire quoi concrètement ?

    Pourquoi un replace dans une boucle ? Tu ne voudrais pas en fait faire ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (int j=0;j<v.size();j++){
        ++v[j];
    }

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 86
    Points : 70
    Points
    70
    Par défaut
    L'exemple était peut être mal choisi. En fait, mon tableau contient des objets. J'effectue un traitement me retournant un autre objet, et je cherche à remplacer un objet du tableau par cet objet là.

    J'ai en fait un "Access violation" (j'utilise des pointeurs), mais j'ai vérifié les valeurs avant le replace, et toutes sont satisfaisantes.

    Merci pour ta réponse en tout cas, c'est vrai que je n'étais pas très claire.

  4. #4
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ce n'est toujours pas clair. Pourquoi utiliser replace dans une boucle ? Tu peux donner le vrai morceau de code ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 86
    Points : 70
    Points
    70
    Par défaut
    Le vrai bout de code, ça va être un peu dur... mais quelque chose y ressemblant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    vector<MonObjet *> v;
    ... // remplissage de v
    MonObjet * p;
    p = new MonObjet;
    for (int i=0;i<v.size();i++){
        p=traitement(v[i]);
        replace(v.begin(),v.end(),v[i],p);
    }
    Voilà en gros ce que je cherche à faire. Enfin, maintenant je modifie directement v[i] dans traitement, et ça fonctionne bien, donc la réponse n'est pas urgente (mais c'est vrai que j'aimerais bien comprendre pourquoi ça ne marchait pas avec replace)...

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    C'est quand même mieux de modifier tout de suite l'élément, d'autant qu'on connaît sa place plutôt que de le rechercher dans le vecteur, non ?

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 86
    Points : 70
    Points
    70
    Par défaut
    En fait, il y a pas mal d'autres traitements qui sont faits avant et après celui là, et j'ai besoin de les ranger quelque part (c'est impossible de faire tous les traitements à la suite sur un objet, et si on modifie un objet, c'est possible qu'on doive en modifier d'autres par rapport à ça... je ne sais pas si je suis très claire là ...).
    En clair, j'ai besoin d'un conteneur, et vector me semble pas mal (pour accéder au ième élément par exemple).

  8. #8
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    La question est plutôt : pourquoi un replace quand on connait l'emplacement de l'élément dans le vecteur ?

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 86
    Points : 70
    Points
    70
    Par défaut
    La boucle, c'est pour le traitement. Et quand le traitement est fait, par la même occasion, je remplace l'objet dans le vecteur.

  10. #10
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    La question n'était pas "pourquoi la boucle", mais "pourquoi le replace".

    En gros, ton code va parcourir tout le tableau pour trouver l'élément v[i] (et par la même occasion tout les éléments ayant la même valeur), et les remplacer par la nouvelle valeur. C'est idiot puisque tu sais déjà que c'est l'élément v[i] que tu veux remplacer. Pourquoi ne pas faire un simple "v[i] = p" ?

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 86
    Points : 70
    Points
    70
    Par défaut
    AH oui, je vois, vu que le replace parcourt encore une fois le tableau. Il me semble qu'au début je ne connaissais pas le rang de l'élément à changer (oui, ça va un peu dans tous les sens...), mais j'ai modifié le code depuis et comme je modifie directement l'élément, il n'y a plus de problèmes. Je réfléchirais mieux au problème la prochaine fois...

    Mais je ne comprends toujours pas pourquoi le replace ne fonctionnait pas. qu'est-ce qui peut faire planter un replace? S'il ne trouve pas l'élément à changer, il ne va rien modifier, non? Et si le nouvel élément est NULL (si c'est un pointeur), il va planter?

  12. #12
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    on, normalement il ne fait que remplacer, il y a peut-être un autre bug, le plus vraissembleble, dans le code qui le faisait planter.

  13. #13
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Vu comment tu manipules ta mémoire, à moins que tu ne nous cache plein de lignes qui rendraient ton code correct, ça ne m'étonnerait qu'à moitié qu'il y ait une fausse manip quelque part.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 86
    Points : 70
    Points
    70
    Par défaut
    Je suis en train de tout tester pour voir s'il y a une erreur quelque part, mais pour l'instant il n'y a pas de problèmes. Pour le code, oui, il y a plein d'autres lignes, et pour l'instant ça fonctionne, mais en ce moment je suis très pressée donc je ne suis pas à l'abri d'un oubli.
    Enfin, je me demande si c'est pas le passage du p (dans un des messages précédents) qui posait problème, mais là, vu que je n'utilise plus le p, je ne peux pas vraiment voir si l'erreur venait de là ou non.
    En tout cas, merci de m'avoir accordé du temps.

Discussions similaires

  1. [langage] incrementation de variable dans une boucle
    Par mimilou dans le forum Langage
    Réponses: 15
    Dernier message: 16/04/2004, 13h23
  2. Problème avec TNMSMTP dans une boucle.
    Par Orgied dans le forum Web & réseau
    Réponses: 3
    Dernier message: 07/04/2004, 10h19
  3. swf dans une boucle asp
    Par Chucky69 dans le forum Flash
    Réponses: 11
    Dernier message: 10/02/2004, 17h07
  4. [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
  5. 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