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 :

Trier un vector


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 57
    Points : 20
    Points
    20
    Par défaut Trier un vector
    Bonjour,

    j'aurais besoin de trier un vector personnalisé je vous explique:

    le vector est de type <Structure*> et Structure est une classe abstraite avec différentes classes filles qui sont :

    -LongitudinalBulkhead
    -InnerDeck
    -WeatherDeck ...

    voila ce que j'ai pour l'instant pour trier le tableau en fonction d'une variable qui s'appel position contenu dans chaques classes filles:


    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
        Structure* a;
        Structure* b;
     
        if(struc->retour_type() == "WeatherDeck" || struc->retour_type() == "InnerDeck")
        {
            for(std::vector<Structure*>::iterator p = collec_elem_attaches.begin(); p!=collec_elem_attaches.end();++p)
            //for(size_t i = 0 ; i< collec_elem_attaches.size() ; ++i)
            {
                for(std::vector<Structure*>::iterator q = collec_elem_attaches.begin(); q!=collec_elem_attaches.end()-1;++q)
                {
     
                   if((*q)->retour_position() > (*++q)->retour_position())
                   {
                       a=(*q);
                       b=(*++q);
                       collec_elem_attaches.erase(q++);
                       collec_elem_attaches.insert(q,b);
     
                   }
                }
            }
        }
        else if(struc->retour_type()== "LongitudinalBulkhead")
        {
           for(std::vector<Structure*>::iterator p = collec_elem_attaches.begin(); p!=collec_elem_attaches.end();++p)
            {
               for(std::vector<Structure*>::iterator q = collec_elem_attaches.begin(); q!=collec_elem_attaches.end()-1;++q)
                {
                   if((*q)->retour_position() > (*++q)->retour_position())
                   {
                       a=(*q);
                       b=(*++q);
                       collec_elem_attaches.erase(q++);
                       collec_elem_attaches.insert(q,b);
     
     
                   }
                }
            }
        }

  2. #2
    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 963
    Points
    32 963
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    pour trier un std::vector, il suffit d'utiliser std::sort.
    Avec le foncteur adéquat à créer ou l'utilisation des opérateurs membres de comparaison, ton code sera très simplifié.
    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.

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 57
    Points : 20
    Points
    20
    Par défaut
    Oui j'ai vu cette solution mais je ne sait pas comment l'appliquer avec mon code aurais tu un exemple ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     std::sort(collec_elem_attaches.begin(),collec_elem_attaches.end());
    me dit que sort ne fait pas parti de std.

  4. #4
    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 963
    Points
    32 963
    Billets dans le blog
    4
    Par défaut
    La comparaison pour savoir si un item précède ou non l'autre c'est ça je suppose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if((*q)->retour_position() > (*++q)->retour_position())
                   {
                       a=(*q);
                       b=(*++q);
                       collec_elem_attaches.erase(q++);
                       collec_elem_attaches.insert(q,b);
     
                   }
    Le plus simple c'est l'opérateur<, utilisé par défaut si on n'utilise pas de foncteur.
    N'ayant aucune connaissance de ton code, je dirais ça à tout hasard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Structure
    {
    public:
     bool operator<(const Structure& st) const
    {
     return retour_position() < st.retour_position();
    }
    };


    me dit que sort ne fait pas parti de std.
    #include <algorithm> ?


    btw, pourquoi faire un if et else if pour écrire 2 algorithmes strictement identiques ?
    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.

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 57
    Points : 20
    Points
    20
    Par défaut
    oui je viens de remarquer ca aussi enfet je suis en stage et je reprend le code d'un élève qui à effectué son stage l'année dernier donc je ne peut pas te dire pk il a fait ça
    je test ta solution et je reviens vers toi merci

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Puisque tes vecteurs contiennent des pointeurs et pas les éléments eux-même, je ne crois pas que surcharger Structure::operator< sera suffisant.
    Je verrais plutôt un objet-fonction :
    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
     
    // Solution C++ classique
    struct Comparator {
      bool operator()(const Structure* a, const Structure* b) {
        return ( a->retour_position() < b->retour_position() );
      }
    } comparator;
     
    // Solution C++11
    auto comparator = [] (const Structure* a, const Structure* b) -> bool {
      return ( a->retour_position() < b->retour_position() );
    };
     
    // Tri
    std::sort(collec.begin(), collec.end(), comparator);

  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 963
    Points
    32 963
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par cob59 Voir le message
    Puisque tes vecteurs contiennent des pointeurs et pas les éléments eux-même, je ne crois pas que surcharger Structure::operator< sera suffisant.
    Je verrais plutôt fait un objet-fonction
    Ce qui permet de retomber sur tes pates, dans la mesures où l'opérateur utilise juste la méthode retour_position() qui, j'espère est bien faîte, et est probablement virtual (sinon aucune solution de fonctionne de toutes façons) et donc indépendant de la vraie Structure.
    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.

  8. #8
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 57
    Points : 20
    Points
    20
    Par défaut
    cela ne fonctionne pas le tableau est trié comme cela :


    ordre avant le tri : -0.6
    ordre avant le tri : 0
    ordre avant le tri : 0.6
    ordre avant le tri : -0.44
    ordre avant le tri : 0.44

    ordre après le tri : -0.44
    ordre après le tri : 0.44
    ordre après le tri : -0.6
    ordre après le tri : 0
    ordre après le tri : 0.6

  9. #9
    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 963
    Points
    32 963
    Billets dans le blog
    4
    Par défaut
    Etant donné que le principe est le bon, vérifie plutôt les retours de retour_fonction().
    Mais ça sort désormais de notre périmètre (sauf boule de cristal).

    Bienvenue dans la phase de debug.
    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.

  10. #10
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 57
    Points : 20
    Points
    20
    Par défaut
    bon ca sera pour demain alors merci beaucoup pour ton aide

  11. #11
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 57
    Points : 20
    Points
    20
    Par défaut
    Ce code fonctionne j'ai finalement fait sans le sort :
    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
    17
    18
    19
    20
    21
    22
    23
     
     Structure* a;
        Structure* b;
     
           for(size_t i = 0 ; i< collec_elem_attaches.size() ; ++i)
            {
                    for(size_t j = 0 ; j< collec_elem_attaches.size() ; ++j)
                    {
                        if(collec_elem_attaches.size() > j+1 )
                        {
     
                           if(collec_elem_attaches[j]->retour_position() > collec_elem_attaches[j+1]->retour_position())
                           {
                               a=collec_elem_attaches[j];
                               b=collec_elem_attaches[j+1];
                               collec_elem_attaches.insert(collec_elem_attaches.begin() + j ,b);
                               collec_elem_attaches.erase(collec_elem_attaches.begin() + (j+2));
     
                           }
                        }
                      }
     
            }

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

Discussions similaires

  1. trier un vector via bind
    Par guillaume07 dans le forum Boost
    Réponses: 3
    Dernier message: 23/04/2010, 19h49
  2. Réponses: 2
    Dernier message: 11/07/2003, 18h24
  3. trier les données dans le cache ??
    Par psyco2604 dans le forum XSL/XSLT/XPATH
    Réponses: 31
    Dernier message: 10/06/2003, 10h03
  4. Créer une vue pour trier une requete UNION ?
    Par Etienne Bar dans le forum SQL
    Réponses: 3
    Dernier message: 03/01/2003, 20h22
  5. trier un tableau et compter des elements du tableau
    Par remi51 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 17/06/2002, 16h51

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