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 algo replace


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 stl algo replace
    Salut,

    Je ne comprends pas bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int a [5] = { 2,2,7,9,0} ;
    replace( a, a+5, 2, -1) ; //  bon ?
    Mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    string z( "Un chat qui mange un chat") ;
    replace( z.begin(), z.end(), "chat", "chien") ;  // là pas bon
    Pourtant il me semble bien que l'opérateur == existe bien pour les std::string ?

    Je sais qu'il existe une méthode "replace" pour les "string", mais je pensais que l'algo "replace" pouvait en faire autant.

    D'où vient l'erreur ?

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par dj.motte Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    string z( "Un chat qui mange un chat") ;
    replace( z.begin(), z.end(), "chat", "chien") ;  // là pas bon
    Cela ne doit pas compiler non?
    ici tu parcoure les caractères pas les mots. Donc cela ne marchera pas

    Citation Envoyé par dj.motte Voir le message
    Je sais qu'il existe une méthode "replace" pour les "string", mais je pensais que l'algo "replace" pouvait en faire autant.
    Je ne connait pas mais si il y as ce que tu veut tu n'as pas trop le choix. Peut etre avec boost.tokenizer
    tu peut faire cel

  3. #3
    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 stl algo replace
    salut,

    Je ne connait pas mais si il y as ce que tu veut tu n'as pas trop le choix. Peut etre avec boost.tokenizer
    tu peut faire cel
    Bon on ne va pas ressortir "boost" dès la moindre question ?

    En l'occurrence je ne vois pas bien la réponse.
    Il y a un truc qui cloche comme sous mon nez, mais je ne vois pas ...

  4. #4
    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
    Une string est un conteneur de char. std::replace un élément d'un conteneur par un autre. Donc ce qui pourrait marcher pour une string serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string z( "Un chat qui mange un chat") ;
    replace( z.begin(), z.end(), 'c', 'C') ;
    Autrement, au sujet de boost, il y a justement plein d'algorithmes adaptés aux chaînes, dans boost::string_algo .
    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.

  5. #5
    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,

    Il y a de fortes chances pour que dans le comportement replace de la std::string (s'il existe, mais je te fais confiance ), le remplacement soit fait sur base des fonctions C de gestion de chaines, telles que strcmp et autres joyeusetés du genre.

    Il ne faut pas oublier le fait que la std::string englobe toute une gestion de "tableau de caractères", et que c'est peut etre là que le bât blesse

    L'algorithme std::replace quant à lui a de grandes chances d'être prévu pour permettre le remplacement... d'objets

    Si donc tu as un comportement replace() pour la std::string, il est fortement préférable de l'utiliser de préférence à tout autre si tu en as besoin
    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

  6. #6
    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 stl algo replace
    Salut,

    Une string est un conteneur de char. std::replace un élément d'un conteneur par un autre. Donc ce qui pourrait marcher pour une string serait :

    Code :

    string z( "Un chat qui mange un chat") ;
    replace( z.begin(), z.end(), 'c', 'C') ;
    Ben oui, cela ne fonctionne que pour un caractère et non pas pour une chaîne de caractères.

    Merci à tous ...

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par dj.motte Voir le message
    Bon on ne va pas ressortir "boost" dès la moindre question ?
    lol
    C'est le problème, il y as des choses que l'on trouve dans les autre langage et non dans le C++. BOOST en comble une bonne partie .

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Vu que tu n'aime pas boost voici une solution avec la STL :


    Code C++ : 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
     
    #include <iostream>
    #include <sstream>
    #include <vector>
    #include <algorithm>
    #include <iterator>
     
     
    struct chatchien
        {
        std::string operator() (const std::string & ss) {return ss == "chat" ? "chien" :ss;};
        } ;
     
    int main(int argc,char ** argv)
        {
     
       std::istringstream is ("Un chat qui mange un chat");
       std::stringstream ios ;
     
        //parcoure le flux mot à mot et applique le foncteur chatchien. Stocke le resultat dans un autre flux en ajoutant un espace aprés chaque mot
        std::transform(std::istream_iterator<std::string>(is) ,std::istream_iterator<std::string>()
            ,std::ostream_iterator<std::string>(ios," "),chatchien() );
     
        std::string result;
     
        //récupère la phrase dans le flux il y aura un espace en trop la fin.
        std::getline(ios,result);
        std::cout<<result<<std::endl;
     
        return 0;
    }

  9. #9
    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
    Salut,

    Merçi Mongaulois pour la solution sans boost ... Bof un peu compliqué. Ce n'est pas que je n'aime pas boost, mais j'évite d'y avoir recours pour un oui ou un non.

    J'avais trouvé une solution sans doute pas assez compliquée...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void replace_words( string& z, const string& ow, const string& nw )
    {   size_t p = 0 ;
        while( string::npos != (p = z.find(ow,p)) )
        {
           z.replace(p,ow.length(), nw ) ;
        }
    }
    Par contre j'ai du faire un code affreux pour que cette fonction soit sensible à la casse, une sorte de C++ bidouillé :

    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
     
    size_t  case_find( size_t pos , const string&  z , const string& sub, bool exact  )
    {
          typedef int (*fcmp)( const char *, const char *, size_t ) ;
          fcmp C = ( exact  ==  true  ) ?  ::strncmp :   ::strncasecmp ;
     
         if( sub.length()  < z.length()  &&   pos <  z.length() - sub.length()  )  ;
         {
              while( z[ pos ] )
             {
                 if( ! C( &z[ pos ], &sub[0], sub.length()  ) ) return pos ;
                 pos++ ;
             }
         }
         return string::npos  ;
    }
     
    void replace_words( string& z, const string& ow, const string& nw, bool ex )
    {   size_t p = 0 ;
        while( string::npos != (p = case_find( p , z,  ow, ex )) )
        {
           z.replace(p,ow.length(), nw ) ;
        }
    }
    Pas terrible, mais je ne vois pas comment faire autrement... Mais si avec boost !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/04/2011, 14h06
  2. cherche algos Delphi pour : Huffman, R.S.A, D.E.S.
    Par X-Delphi dans le forum Débuter
    Réponses: 3
    Dernier message: 24/08/2002, 18h51
  3. Cherche l'algo crc 16 bits
    Par icepower dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 21/08/2002, 13h27
  4. Algo de calcul de FFT
    Par djlex03 dans le forum Traitement du signal
    Réponses: 15
    Dernier message: 02/08/2002, 17h45
  5. Recherche algo tree
    Par Anonymous dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 24/05/2002, 13h44

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