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 :

Problème avec les set et la fonction transform


Sujet :

SL & STL C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Problème avec les set et la fonction transform
    Bonjour,

    Voilà, j'ai un petit problème avec la fonction transform pour appliquer un foncteur...
    Mon code complilait lorsque j'utilisait un vecteur, mais depuis que je l'ai remplacé par un set, le compilo gueule...

    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
    #ifndef IMAGE_H 
    #define IMAGE_H 
     
    #include <iostream> 
    #include <string> 
    #include <set> 
    #include <iterator> 
    #include <cctype> 
    #include <algorithm> 
    using namespace std; 
     
    class Image{ 
    private: 
            set<string> mots_cles; 
        string nom; 
            string datepdv; 
            float taille; 
            int largeur; 
            int hauteur; 
    public: 
     
    //conversion en minuscules des mots clés : 
     
        class to_lower{ 
              public: 
                     inline string operator()(string& s){ 
                            int cpt = 0; 
                            while ( s[cpt] != '\0' ){ 
                                  if ( ( s[cpt] >= 'A' ) && ( s[cpt] <= 'Z' ) ) s[cpt] += 32; 
                                  cpt++; 
                            } 
                            return(s); 
                     }   
        };   
     
        inline void mots_cles_en_minuscules(){ 
               transform(mots_cles.begin(), mots_cles.end(), mots_cles.begin(), to_lower()); 
        } 
    }; 
     
    #endif
    Voici l'erreur que me met le compilateur (pour info j'utilise dev C++ sous vista) :

    C:\Dev-Cpp\include\c++\3.4.2\bits\stl_algo.h In function `_OutputIterator std::transform(_InputIterator, _InputIterator, _OutputIterator, _UnaryOperation) [with _InputIterator = std::_Rb_tree_const_iterator<std::string>, _OutputIterator = std::_Rb_tree_const_iterator<std::string>, _UnaryOperation = Image::to_lower]':

    789 C:\Dev-Cpp\include\c++\3.4.2\bits\stl_algo.h no match for call to `(Image::to_lower) (const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'

    note F:\Pas musique\IUT 2A\C++\imagestl\image.h:112 candidates are: std::string Image::to_lower::operator()(std::string&)

    Merci à ceux qui voudront bien me consacrer un peu de leur temps.

  2. #2
    Membre averti Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Points : 323
    Points
    323
    Par défaut
    Bonjour,
    Le paramètre passé a ton operateur () devrait être const:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    inline string operator()(const string& s){ 
      int cpt = 0; 
      string res(s);
      while ( res[cpt] != '\0' ){ 
        if ( ( res[cpt] >= 'A' ) && ( res[cpt] <= 'Z' ) ) res[cpt] += 32; 
        cpt++; 
      } 
      return(res); 
    }
    Et aussi tu ne devrai pas faire de using namespace dans un fichier d'entête, car tout les fichiers qui l'inclurons vont inclure le using avec, et tu perd l'intérêt des espaces de nommages.

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut
    ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     transform(mots_cles.begin(), mots_cles.end(), mots_cles.begin(), to_lower());
    Ne pourra pas compiler pour un set et heureusement.
    Le set est un ensemble trié.
    Son parcour est autorisé.
    Cette partie est bonne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    transform(mots_cles.begin() , mots_cles.end() ,   ......   , to_lower())
    Mais pas le "mots_cles.begin()" qui remplace ......
    Car cela modifie la valeur des éléments du set. Hors rien ne garantie que ton transforme garde l'ordre.
    Tu pourrais te retrouver avec un set non trié

    [edit]
    A ceci s'ajoute le problème du const de ton foncteur comme la précisé Nogane

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Au faite tu peut utiliser insert iterator et la fonction swap

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    std::set<...> nouveauSet;
     
     transform
    (
       mots_cles.begin(), 
       mots_cles.end(), 
    //iterator qui appel la méthode insert à chaque nouveau élément=> les éléments restent donc trié
       std::inserter( nouveauSet, nouveauSet.begin() ), 
       to_lower()
    );
    //échange les données entre les set
    mots_cles.swap(nouveauSet);

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Mon programme tourne

    Mille merci à vous 2

  6. #6
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Si l'objectif c'est de modifier le conteneur, pourquoi ne pas utiliser un std::for_each plutôt qu'un transform??

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

Discussions similaires

  1. Problème avec les sockets et la fonction accept
    Par projeticq dans le forum Réseau
    Réponses: 6
    Dernier message: 13/04/2007, 11h37
  2. Réponses: 1
    Dernier message: 25/11/2005, 20h40
  3. Réponses: 2
    Dernier message: 10/05/2005, 10h58
  4. Problème avec les fonctions
    Par jvachez dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/01/2004, 12h06
  5. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 09h04

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