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] Fonction pour déplacer un élément dans un conteneur ?


Sujet :

SL & STL C++

  1. #1
    ovh
    ovh est déconnecté
    Rédacteur
    Avatar de ovh
    Homme Profil pro
    Architecte devops web full stack
    Inscrit en
    Mai 2002
    Messages
    3 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte devops web full stack

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 841
    Points : 6 514
    Points
    6 514
    Par défaut [STL] Fonction pour déplacer un élément dans un conteneur ?
    Bonjour

    Je poste très rarement ici, j'ai cherché mais pas trouvé de topic satisfaisant ma question

    Voici mon problème : dans un conteneur standard (list, vector, etc.), existe-t-il une fonction membre simple pour déplacer un élément ?
    Exemple : liste de 5 nombres
    1 2 3 4 5
    Je voudrais déplacer l'élément 4 en position 2, ce qui donne :
    1 4 2 3 5
    Moi je verrais un code genre liste.move(iterateur4, iterateur2) iterateur4 étant un itérateur pointant sur l'élément 4 et pareil pour le 2

    Mais je ne trouve jamais aucune fonction correspondant à cela dans les classes containers de la STL

    Le seul truc que j'ai trouvé plus ou moins approchant c'est la fonction splice() de la classe STL list. Ca marche, mais c'est un peu lourd.

    N'existe-t-il rien de plus simple ?


  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Ce n'est pas une fonction "simple", puisque ça fait un décalage massif.
    À ta place, je me concentrerait sur std::list pour ce genre de manip. Une suppression+une insertion ne devraient pas être trop couteux pour ce conteneur...

  3. #3
    ovh
    ovh est déconnecté
    Rédacteur
    Avatar de ovh
    Homme Profil pro
    Architecte devops web full stack
    Inscrit en
    Mai 2002
    Messages
    3 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte devops web full stack

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 841
    Points : 6 514
    Points
    6 514
    Par défaut
    Citation Envoyé par Médinoc
    Ce n'est pas une fonction "simple", puisque ça fait un décalage massif.
    Euh, ne suffit-il pas de modifier quelques pointeurs ?

    Si on considère une liste doublement chaînée, il me semble que le déplacement d'un élément consiste à :
    - modifier les 2 pointeurs entourant la position originale de l'élément (càd le pointeur "next" de l'élément précédent, et le pointeur "prev" de l'élément suivant)
    - modifier les pointeurs next et prev des éléments qui vont l'entourer à sa nouvelle position
    - enfin modifier les pointeurs next et prev de l'élément migrateur lui-même

    Non ?


    NB : Cependant l'idée de la suppression puis réinsertion de l'élément me semble excellente pour simplifier le code, en effet, merci

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Puor le décalage, je parlais dans le cas d'un vector.
    En effet, c'est bien plus simple pour une list.

  5. #5
    ovh
    ovh est déconnecté
    Rédacteur
    Avatar de ovh
    Homme Profil pro
    Architecte devops web full stack
    Inscrit en
    Mai 2002
    Messages
    3 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte devops web full stack

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 841
    Points : 6 514
    Points
    6 514
    Par défaut
    Ah ok, ouf, tu me rassures

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 125
    Points : 145
    Points
    145
    Par défaut
    Salut,


    sur une liste un insert et un erase et c'est bon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    iterator insert(iterator pos, const T& x);
    iterator erase(iterator pos);
    en esperant que la copie de T soit pas trop longue

    enfin choisi surtout ton conteneur en fonction de l'utilisation la plus courrante que tu en fais. (ton besoin de swaper des données est peut etre tres faible par rapport a un besoin d'acces par index ou a une recherche ...)

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    rotate() tout simplement non ?

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 125
    Points : 145
    Points
    145
    Par défaut
    sinon celle la peut etre swap_ranges, c'est une fonction, c'est pas un membre.

  9. #9
    ovh
    ovh est déconnecté
    Rédacteur
    Avatar de ovh
    Homme Profil pro
    Architecte devops web full stack
    Inscrit en
    Mai 2002
    Messages
    3 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte devops web full stack

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 841
    Points : 6 514
    Points
    6 514
    Par défaut
    Sorry pour le temps de réponse, boulot tout ça...

    J'ai testé toutes les possibilités que vous m'avez suggérées :
    - erase + insert : marche (forcément )
    - rotate : fonctionne mais uniquement dans un sens il me semble, donc inutilisable de manière générale
    - swap_ranges : ne fonctionne pas, car cela échange des éléments (comme son nom l'indique ), ce n'est pas un déplacement
    - mon test avec la fonction membre list::splice() fonctionnait donc aussi

    Voilà le bilan En résumé le plus simple est clairement l'effacement + réinsertion.


  10. #10
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    rotate : fonctionne mais uniquement dans un sens il me semble, donc inutilisable de manière générale
    Il suffit dans ce cas de prendre le problème dans l'autre sens...

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 09/11/2009, 19h56
  2. Réponses: 6
    Dernier message: 31/07/2006, 16h01
  3. Réponses: 2
    Dernier message: 18/05/2006, 13h38
  4. fonction pour interdire un caractere dans un champ en php
    Par carmen256 dans le forum Langage
    Réponses: 2
    Dernier message: 15/03/2006, 22h41
  5. Réponses: 2
    Dernier message: 15/10/2005, 23h29

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