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 vecteur


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Par défaut Tri d'un vecteur
    Bonsoir a tous,
    je viens soliciter votre aide sur le tri d'un vecteur.
    Enfait je sai qu'il est possible de trier un vecteur avec 'sort' mais ce que je souhaiterai c'est qu'il le tri dans l'ordre alphabétique sans prendre compte de la casse et bien évidament qu'il me supprime les doublons (chose que je n'arrive pas a faire avec unique() ).
    Je remerci par avance tous ceux qui m'aideront

  2. #2
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Tu peux définir une fonction de comparaison ou un foncteur, que tu passerais en argument à sort et unique().

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Par défaut
    Une fonction de comparaison qui prenne pas en compte la casse je voi pas trop etje n'arrive pas a utiliser unique() est ce qu'il fonction bien pour les vecteur car moi lorsque je creer un vecteur de string et ke japplique unique apres l'avoir triée cela ne change pas mon vecteur alors est ce moi ki l'utilise mal ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ....
    vector<string> v = ("salut", "salut", "toto", "aaa");
    sort(v.begin(),v.end()); //apres sort j'obtiens bien v("aaa", "salut", "salut", "toto")
    unique(v.begin(),v.end()); // apres unique j'obtiens v("aaa", "salut", "salut", "toto")
    Merci de m'aider ou de m'expliquer ce qui ne va pas.
    Ps: c'est quoi un foncteur

  4. #4
    Nouveau candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2
    Par défaut
    Tu peux réecrire la fonction de suppresion des doublons.
    Sachant ton vecteur trié, tu compares ton élément à l'élément suivant et tu le supprimes (l'actuel ou le suivant, au choix mais pas les deux) et c'est tout =] (ta fonction prendra en paramètre le vecteur)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Par défaut
    je ne voi pas du tout commen ecrire cette fonction est ce ke kkun pourai m'aider ou me dire pkoi unique() ne fonctionne pas
    merci

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut


    Pourquoi pas un std::set (conteneur trié qui évite les doublons) avec comme paramètre de comparaison un foncteur qui compare les chaînes en minuscules (pour ne pas tenir compte de la casse) ?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Par défaut
    mais qu'est ce qu'unfoncteur svp et comment s'utilise set quoi quel include choisir svp
    merci d'avance pour vos réponses

  8. #8
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    Citation Envoyé par killer75
    mais qu'est ce qu'unfoncteur svp et comment s'utilise set quoi quel include choisir svp
    merci d'avance pour vos réponses
    regarder dans la FAQ SVP...
    http://c.developpez.com/faq/cpp/?page=STL#STL_functor

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Par défaut
    En fait le but et que je puisse trier un texte pris en entrée et que j'affiche ligne par ligne les mots du texte un par ligne dans l'ordre alphabétique sans prendre en compte la casse et en utilisant qu'un seul vecteur.
    En gros voici mon énnoncer:
    Ecrivez un programme qui affiche les mots d'un texte à raison d'un par
    ligne, triés, et sans doublons. Seulement voilà, cette dernière contrainte
    doit ici être indépendante de la casse (MAJ/min).

    Pour ce faire, vous devrez avoir recours à un prédicat personnalisé pour le
    tri des chaînes et un autre pour l'unicité des chaînes.

    Vous devez réaliser les transformations en place, sans recourir à des
    vecteurs ou strings supplémentaires.

    Dites moi si je fais fausse route avec mon tri de vecteur ???
    Si oui aiguillez moi svp car la je patoge un petit peu

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Par défaut
    voici un exemple d'un de mes codes mais qui fait appel à une copie de vecteur donc je crois que cela ne répond pas trop au sujet.
    Mais malgrès ca j'ai une erreur a la compilation (lol faut dire qu'apparament je suis pas doué)


    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
    #include <algorithm>
    #include <iostream>
    #include <iterator>
    #include <string>
    #include <vector>
     
    using std::cerr;
    using std::cin;
    using std::cout;
    using std::endl;
    using std::string;
    using std::vector;
    using std::iterator;
     
    inline bool eq_nocase(char c1, char c2) { return tolower(c1) == tolower(c2); }
     
    inline bool lt_nocase(char c1, char c2) { return tolower(c1) < tolower(c2); }
     
    int main()
    {
      const char init[] = "The Standard Template Library";
      vector<char> V(init, init + sizeof(init));
      sort(V.begin(), V.end(), lt_nocase);
      copy(V.begin(), V.end(), ostream_iterator<char>(cout));
      cout << endl;
      vector<char>::iterator new_end = unique(V.begin(), V.end(), eq_nocase);
      copy(V.begin(), new_end, ostream_iterator<char>(cout));
      cout << endl;
    }
    l'erreur lors de la compilation est la suivante:
    iii.cpp: In function «int main()»:
    iii.cpp:25: erreur: «ostream_iterator» was not declared in this scope
    iii.cpp:25: erreur: expected primary-expression before «char»
    iii.cpp:28: erreur: expected primary-expression before «char»

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    iii.cpp:25: erreur: «ostream_iterator» was not declared in this scope
    std::ostream_iterator marchera mieux

    A part ça là tu manipules des caractères, pas des chaînes.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Par défaut
    est il possible de comparer deux string sans la casse et sans avoir a decoupez les string en caractère car je n'ai apparamen le droit qu'a un seul vecteur et deux prédicat donc dans mon cas je garde le prédicat de comparaison:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool eq_nocase(char c1, char c2) { return tolower(c1) == tolower(c2); }
    mais avec des string (je vois pas trop comment faire mais bon ca doit etre faisable
    et le prédicat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool lt_nocase(char c1, char c2) { return tolower(c1) < tolower(c2); }
    mais avec des strings lui aussi.
    Si quelqu'un pouvai m'aider ou du moins bien m'orienter car la j'avoue ne pas réussir a m'en sortir.
    Merci d'etre aussi patient avec moi ....

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Par défaut
    désolé de solicité autant d'aide,
    mais il y aurai t il quelqu'un qui pourai deja pour commencer m'indiquer comment créer les meme prédicat ci-dessus mais avec des string au lieu de caractere.
    Merci d'avance pour votre aide je sais que c'estpas toujours facile d'aider les newbee car on a l'impression qu'ils ne comprennent rien a rien et c'est vrai que c'est dur mais c'est comme ca que l'on aprend je crois

  14. #14
    Inactif  

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

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Bonjour,

    Pour une comparaison signée entre deux chaînes ( string) , dans le tri, l' opérateur de comparaison faît l' affaire.

    Pour une comparaison non signée, il faut convertir en majuscules avant de comparer, soit en filant à "sort" une fonction de comparaison.

    Mais on ne peut pas demander au tri ( sort ) , d' avoir des fonctions magiques comme la réductions des doublons.

    A mon avis "unique" fonctionne d' une paire d' itérateurs vers un autre itérateur.

    Mais je n' en sais rien. La solution des "map" ou "set", multi ou pas pourrait répondre à votre besoin de conception.

    Mais j' ai plutôt l' habitude de respecter la demande du développeur.

    Soit vous demandez un tri résorsif ?

    Expliquez-moi le problème ?

    salut.

  15. #15
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par dj.motte
    Pour une comparaison non signée, il faut convertir en majuscules avant de comparer, soit en filant à "sort" une fonction de comparaison.
    Ce n'est pas la même chose. Par exemple, dans une locale allemande, convertis en majuscule, "ß" et "ss" donnent toutes deux "SS", mais ne comparent pas identiquement, même en case-insensitive.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Par défaut
    voici mon code:
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    #include <algorithm>
    #include <iostream>
    #include <iterator>
    #include <string>
    #include <vector>
     
    using std::cerr;
    using std::cin;
    using std::cout;
    using std::endl;
    using std::string;
    using std::vector;
    using std::iterator;
     
    bool equal(string s1, string s2) {
     if ( s1.length() != s2.length())
    	return false;
     for( unsigned int i = 0; i < s1.length(); i++){
    	if(tolower(s1[i]) != tolower(s2[i]))
    		return false;
     }
     return true;
    }
     
    bool before(string s1, string s2) {
     int t;
     if ( s1.length() <= s2.length())
    	t = s1.length();
     else
    	t = s2.length();
     for(int i = 0; i < t; i++){
    	if(tolower(s1[i]) > tolower(s2[i]))
    		return false;
     }
     return true;
    }
     
    void displayLine(string const& s) {
        cout << s << endl;
    }
     
    int main(int argc, char const * argv[])
    {
      vector<string> V;
      for( int i = 1; i < argc; i++)
      V.push_back(argv[i]);
      vector<string>::iterator new_end = unique(V.begin(), V.end(), equal);
      sort(V.begin(), new_end, before);
      for_each(V.begin(), new_end, displayLine);
     
    }
    lorsque dans l'entrée standard je tape:
    ./a.out WORLD world
    j'obtiens bien:
    WORLD

    mais si je rentre:
    WORLD HELLO
    j'ai:
    WORLD
    HELLO
    et non pas:
    HELLO
    WORLD

    j'ai remarquer que mon test ne fonctionne pas lorsque les string avaient la meme taille alors pouriez vous me dire d'ou cela proviens svp ( je me doute qu'il s'agit de ma fonction before mais pourquoi)
    Si vous trouvez d'ou cela proviens pouvez vous me donnez la solution svp car il n'y a que se bug le reste fonctionne.
    Merci par avance!!!

  17. #17
    Inactif  

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

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Bonjour,

    JolyLoic écrit :

    Ce n'est pas la même chose. Par exemple, dans une locale allemande, convertis en majuscule, "ß" et "ss" donnent toutes deux "SS", mais ne comparent pas identiquement, même en case-insensitive.
    Ben oui en Allemand 'sollen' ne veut pas dire 'müssen'. Bref... C' est mon cher ami une question de vocabulaire Européen. Les caractères accentués que vous voyez des différentes langues Européennes pourrait vous tromper.

    Il est éffectif que les sorciers en informatique, ne pourront jamais traduire une langue vers l' autre.
    Le problème des dictionnaires est qu' ils ne pourront jamais établir l' équivalence d' une langue à l' autre.
    Même s' il existe des logiciels de traduction naïve.

    On se ratatine donc dans des langages plus automatisés .( .NET par exemple )

    Pour répondre à mon locuteur, je lui dirai simplement que le tri résorbsif n' existe pas dans le C++.

    Mais vous allez sans doûte me prouver le contraire ?

    Cordialement.

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Par défaut
    je viens de m'appercevoir qu'and fait si le dernier caractere du mot le plus cours est avant la lettre du deuxieme mot (au meme emplacement du caratere du premier mot) alors mon test ne fonctionne pas.
    ex:
    the abc
    donne bien:
    abc
    the

    mais:
    the abf
    donne:
    the
    abf

    car f>e
    comment résoudre mon problème ( mon code est ci-dessus)
    Merci de m'aider svp

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Par défaut
    voici mon nouveau code:
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    #include <algorithm>
    #include <iostream>
    #include <iterator>
    #include <string>
    #include <vector>
     
    using std::cerr;
    using std::cin;
    using std::cout;
    using std::endl;
    using std::string;
    using std::vector;
    using std::iterator;
     
    bool equal(string s1, string s2) {
     if ( s1.length() != s2.length())
    	return false;
     for( unsigned int i = 0; i < s1.length(); i++){
    	if(tolower(s1[i]) != tolower(s2[i]))
    		return false;
     }
     return true;
    }
     
    bool before(string s1, string s2) {
     int t;
     bool test = false;
     if ( s1.length() <= s2.length())
    	t = s1.length();
     else
    	t = s2.length();
     for(int i = 0; i < t; i++){
    	if(tolower(s1[i]) <= tolower(s2[i]))
    		test = true;
    	if(tolower(s1[i]) > tolower(s2[i]))
    		break;
     }
     return test;
    }
     
    void displayLine(string const& s) {
        cout << s << endl;
    }
     
    int main(int argc, char const * argv[])
    {
      vector<string> V;
      for( int i = 1; i < argc; i++)
      V.push_back(argv[i]);
      vector<string>::iterator new_end = unique(V.begin(), V.end(), equal);
      sort(V.begin(), new_end, before);
      for_each(V.begin(), new_end, displayLine);
     
    }
    maintenant il me trie bien les string mais ne me retire pas les doublons s'ils les string identique ne sont pas les unes à cotés des autres.
    De laide svp, merci !!!

    Exemple:
    ./a.out The sun is shining the tank IS clean

    donne:
    clean
    IS
    is
    shining
    sun
    tank
    the
    The

    au lieu de:
    clean
    is
    shining
    sun
    tank
    The

  20. #20
    Inactif  

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

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Bonjour,

    C' est la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bool equal(string s1, string s2)
    Qui n' est pas au point.

    salut.

Discussions similaires

  1. Tri d'un vecteur.
    Par dahmane2007 dans le forum Langage
    Réponses: 5
    Dernier message: 06/04/2009, 08h55
  2. Petits soucis de tri sur un vecteur
    Par d.jphilippe dans le forum Fortran
    Réponses: 3
    Dernier message: 01/08/2008, 23h00
  3. Tri d'un vecteur
    Par dv-2008 dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 30/05/2008, 21h39
  4. Tri Tableau Matrice vecteur
    Par french_aspi dans le forum MATLAB
    Réponses: 9
    Dernier message: 24/03/2008, 14h50
  5. Tri spécial et vecteurs
    Par vinzzzz dans le forum C
    Réponses: 6
    Dernier message: 21/11/2007, 18h47

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