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 :

double iterator pour copy


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Février 2009
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 141
    Par défaut double iterator pour copy
    Bonjour à tous,

    Dans le but d'effectuer une copy en C++, j'aimerais créer une map qui va contenir ma map que je veux copier. J'aimerais donc iterer sur deux map simulatement.

    Dans l'idée ca donne :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     
     
    if(map_a_remplir!= NULL)
    	{
    		map_a_remplir->clear();
    	}
    	else
    	{
    		map_a_remplir= new MapOfStringDouble();
    	}
    for ((MapOfStringDouble::iterator iter_ret =map_a_remplir->begin(); iter_ret !=map_a_remplir->end(); iter_ret ++) && (MapOfStringDouble::iterator iter =map_a_copier->begin(); iter!=map_a_copier->end(); iter++))
    	{
    		iter_ret->first = iter->first;
    		iter_ret->second= iter->second;
    	}
    Auriez vous une idée?
    Merci à tous.

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Une sorte de pari ne connaissant pas les types exacts de tes maps :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *map_a_remplir = *map_a_copier;
    ?
    Au passage c'est bizarre de manipuler des maps par pointeurs...

    MAT.

  3. #3
    Membre confirmé
    Inscrit en
    Février 2009
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 141
    Par défaut
    Salut,

    non ce que tu proposes est un copie shadow alors que je veux faire une copie profonde, c'est à dire prendre ce qu'il y a à l'interieur des pointeurs.

    Une precision mes map sont de types : map<string, double>

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Citation Envoyé par julien25 Voir le message
    (...) c'est à dire prendre ce qu'il y a à l'interieur des pointeurs.
    D'où le déréférencement avec * non ?

    MAT.

  5. #5
    Membre confirmé
    Inscrit en
    Février 2009
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 141
    Par défaut
    Salut,

    Je pense que ce que tu proposes doit en partie marcher avec le dereferencement.
    Cela dit, je préfère copier chaque partie de ma map (first, seconde) comme je l'ai dit plus haut.
    Par ailleurs ca me permettrais de comprendre comment faire ce double iterateur.

    Merci encore.

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Mais map_a_remplir est vide, il n'y a rien à itérer...
    Si vraiment tu veux le faire à la main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for( MapOfStringDouble::iterator iter = map_a_copier->begin(); iter != map_a_copier->end(); ++iter )
      map_a_remplir->insert( *iter );
    Mais bon c'est un peu absurde dans la mesure où une affectation directe fait au pire la même chose...

    MAT.
    ps : et oui, ça copie complètement vraiment profondément tout à fait le contenu

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

    Informations professionnelles :
    Activité : aucun

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

    D'autant plus que, si tu déclare la map à copier au moment opportun, tu peux même directement passer par le constructeur par copie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::map<key, value> map_a_remplir(map_a_copier);
    est justement fait pour que tout se passe correctement

    Ceci dit, et juste pour être sur d'avoir toutes les cartes en main pour t'aider efficacement...
    Je présumes que MapOfStringDouble est en réalité un typedef de std::map utilisant std::string comme clé et double comme valeur, mais est-ce réellement le cas

    Pourquoi passer par un pointeur sur la map et par l'allocation dynamique

    Est-ce juste par masochisme, ou y a-t-il une raison particulière
    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

  8. #8
    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
    A noter qu'un std::for_each utilisant le foncteur back_inserter règleraient tout aussi bien le problème. Ainsi que std::copy. Et bien d'autres façons, la plus simple étant le constructeur de copie.

    Si tu veux programmer correctement en C++ moderne, ne met des pointeurs que quand tu es obligé, ce qui n'est probablement pas le cas lorsque tu travailles sur des std::map, mais il nous faudrait en savoir plus pour en être sûr.

  9. #9
    Membre confirmé
    Inscrit en
    Février 2009
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 141
    Par défaut
    Merci pour vos réponses.

    Première chose : il n' y a aucune raison particulière d'utiliser des pointeurs sur des map. J'avais commencer de la sorte en me disant que ce serait mieux mais sans vraiment comprendre pourquoi. J'ai par contre fait très attention à tout mes delete. Je ferais attention à ce point pour mes futurs softs. Maintenant ce programme est quasi fini et ca me prendrait bcp trop de temps de tout remplacer. (qq 100taines de map)...Est-ce que c'est vraiment important??

    Deuxième chose :

    Suivant tout vos conseils, j'ai finalement fait comme Mat l'avait suggeré :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            MapOfStringDouble* tmpDict;
    	this->myObject->myfunction(tmpDict);
    	this->Map_a_remplir->clear();
    	(*Map_a_remplir) = (*tmpDict)
    PS : Ma Map_a_remplir est declare en global.
    myfunction est une methode de myOject est prnd en parametre la ma rempli.

    koala01 oui c'est un typdef avec une map de string et double.

    Merci encore
    ++

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par julien25 Voir le message
    Merci pour vos réponses.

    Première chose : il n' y a aucune raison particulière d'utiliser des pointeurs sur des map. J'avais commencer de la sorte en me disant que ce serait mieux mais sans vraiment comprendre pourquoi. J'ai par contre fait très attention à tout mes delete. Je ferais attention à ce point pour mes futurs softs. Maintenant ce programme est quasi fini et ca me prendrait bcp trop de temps de tout remplacer. (qq 100taines de map)...Est-ce que c'est vraiment important??
    Heuu... oui et non...

    C'est important dans le sens où cela te libère de tous les soucis qui apparaissent systématiquement lorsque tu manipule des pointeurs et que tu as recours à l'allocation dynamique.

    Mais, évidemment, c'est une chose à prendre en compte... au début du programme...

    Et, si le programme est presque terminé, que tu as la certitude de n'avoir ni double libération de la mémoire ni fuites mémoire, il est un peu tard pour dire quoi que ce soit
    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

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

Discussions similaires

  1. double lien pour frame
    Par Fye-Tofe59 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 27/08/2006, 23h38
  2. Double action pour un OnClick
    Par koKoTis dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/08/2006, 02h25
  3. [SQL] magic quotes ou double apostrophes pour échapper apostrophe
    Par zorian dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 13/03/2006, 16h23
  4. [C#] Double click pour agrandir la fenêtre... Problème
    Par Radium133 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 17/01/2006, 17h41
  5. double click pour soumission de formulaires
    Par pram dans le forum XMLRAD
    Réponses: 2
    Dernier message: 16/11/2005, 12h32

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