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 :

tri d'un tableau, comment trier depuis une colonne précise ?


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 156
    Points : 59
    Points
    59
    Par défaut tri d'un tableau, comment trier depuis une colonne précise ?
    Hello tout le monde, j'ai un tableau de structures de la forme suivante :


    |T| M | LCN | RC | TYPE |

    | 1 | 1 | 1 | Ucf | audio |
    | 2 | 2 | 2 | Ucf | video |
    | 1 | 2 | 2 | Ucf | video |
    | 2 | 1 | 1 | Ucf | audio |

    Je cherche à trier ce tableau selon T (entier) puis ensuite selon TYPE(string), j'ai donc tout d'abord pensé a std::sort( v.begin(), v.end() )

    mais étant donné que le vecteur est un vecteur de structures, c'est un cas de figure un peu particulier ...

    j'ai lu dans la FAQ le cas des foncteurs, mais je me demande si ca peut aider ici ...

    (j'aimerais arriver à ca :

    |T| M | LCN | RC | TYPE |

    | 1 | 1 | 1 | Ucf | audio |
    | 1 | 2 | 2 | Ucf | video |
    | 2 | 1 | 1 | Ucf | audio |
    | 2 | 2 | 2 | Ucf | video |)

    Quelqu'un aurait il un moyen d'y arriver ? merci pour vos réponses !

  2. #2
    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
    En fait, il y a 2 std::sort : http://www.sgi.com/tech/stl/sort.html

    Le deusième prend en argument une fonction qui renvoie vrai ou faux et qui prend 2 const&. Après, tu peux faire une comparaison sur n'importe quel élément de ces const&

  3. #3
    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
    Il faudra effectivement utiliser deux tris (le premier selon Type et le second selon T), avec les foncteurs appropriés (la FAQ comporte plein d'exemples).

    Par contre il faudra utiliser std::stable_sort et non std::sort, pour conserver l'ordre du premier tri.

    Edit : ou alors il suffit d'avoir un foncteur qui trie selon T, et selon Type si les T sont égaux

  4. #4
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 156
    Points : 59
    Points
    59
    Par défaut
    ok je dois pas etre bien loin, j'ai une structure au départ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct ligne_MTE
    {
    int terminal; 
    int ElementListSize; 
    int MultiplexTableEntryNumber; 
    int NumeroLCN; 
    std::string RepeatCount; 
    std::string type; 
    };
    et je créé un vecteur de structures appelé table_MTE (par push_backs successifs de lignes)

    done ensuite je crée un foncteur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    struct ligne_MTECompare
    {
      bool operator()(ligneMTE const &c1, ligneMTE const &c2)
      {return c1.terminal<c2.terminal;}
    }
    seulement lorsque je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    table_MTE.sort(ligne_MTECompare());
    le compilo me sort :

    " expected init-declarator before '.' token "
    comme si je n'avais pas déclaré ma table, ce qui est pourtant le cas !

    une piste ?

  5. #5
    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
    Comment est déclaré table_MTE ? Si ce n'est pas un std::list, ou si tu compiles avec VC6, cete syntaxe n'est pas bonne.

    De plus ton foncteur devrait être le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct ligne_MTECompare
    {
      bool operator()(ligneMTE const &c1, ligneMTE const &c2)
      {
        if (c1.terminal == c2.terminal)
          return c1.type < c2.Type;
        else
          return c1.terminal < c2.terminal;
      }
    }

  6. #6
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 156
    Points : 59
    Points
    59
    Par défaut
    autant pour moi, il me semblait que le sort en question pourvait fonctionner sur les vectors, dois je passer mon vector dans une list ?

  7. #7
    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
    Non, tu utilises std::sort.
    Le sort des std::list a quelques optimisations à cause des capacités du conteneur.

  8. #8
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 156
    Points : 59
    Points
    59
    Par défaut
    ok donc la syntaxe doit etre erronnée (je suis sous dev Cpp )

    et lorsque j'écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct ligne_MTECompare
    {
      bool operator () (ligneMTE const &c1, ligneMTE const &c2)
      {
        if (c1.terminal == c2.terminal)
          return c1.type < c2.Type;
        else
          return c1.terminal < c2.terminal;
      }
    }
    il n'aime pas trop "operator()" puisqu'il me sort :

    "declaration of operator() as non-function "

  9. #9
    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 quoi l'erreur complète ?

  10. #10
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 156
    Points : 59
    Points
    59
    Par défaut
    "In member function `void MTE::affichetable_MTE()':
    declaration of `operator()' as non-function
    expected `;' before '(' token
    expected `;' before '}' token
    expected init-declarator before '<<' token
    expected `,' or `;' before '<<' token

    "

    mais en gros les erreurs découlent de la premiere, operator() n'est pas reconnu en tant que foncteur

  11. #11
    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
    Y'a pas des ';' qui manquent aussi ? à la fin de la déclaration de ligne_...compare ?

  12. #12
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 156
    Points : 59
    Points
    59
    Par défaut
    oui il manquait celui la

    mais ca ne change rien pour l'instant tant pis je vais m'attaquer a un autre probleme ...

Discussions similaires

  1. Réponses: 5
    Dernier message: 29/11/2012, 19h21
  2. Réponses: 0
    Dernier message: 20/09/2010, 13h40
  3. Réponses: 6
    Dernier message: 16/08/2010, 11h12
  4. comment trier depuis une date
    Par laposte dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 18/06/2010, 11h05
  5. Réponses: 5
    Dernier message: 03/02/2006, 01h05

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