Set transform C++ [Résolu]

Signaler
Messages postés
4
Date d'inscription
mercredi 29 octobre 2008
Statut
Membre
Dernière intervention
29 octobre 2008
-
Messages postés
116
Date d'inscription
jeudi 22 juillet 2004
Statut
Membre
Dernière intervention
14 juin 2012
-
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...

#ifndef IMAGE_H
#define IMAGE_H

#include
#include <string>
#include <set>
#include
#include <cctype>
#include
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.

8 réponses

Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
2
J'ai essayé avec gcc et j'ai les mêmes pb que toi... Je pense que l'implémentation de la STL dans GNU considère que les éléments des set sont const et empêche leur modifications. Le mieux serait que tu modifies la casse de tes mots clés au moment de l'insertion dans le set. Quant au ostream_iterator, je ne sais pas...
Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
2
Salut,

Je suis sous Visual C++ 2005 et ton code compile chez moi !?

Cependant, j'ai deux petits conseils :
- supprime la directive "using namespace std;" et laisse std::string, std::set, etc, surtout dans les headers !
- ta manipulation me semble complexe ;normalement les lignes suivantes suffisent pour mettre en miniscule les chaîne de ton conteneur - tolower étant une fonction de la librairie standard.

    for ( std::set<std::string>::iterator it = ss.begin() ; it != ss.end() ; it++ )
    {
        std::transform( it->begin() , it->end() , it->begin() , tolower );
    }
Messages postés
4
Date d'inscription
mercredi 29 octobre 2008
Statut
Membre
Dernière intervention
29 octobre 2008

Salut Lucky92 !

Avec ton code, le compilo me renvoie une erreur du même genre :

124 F:\Pas musique\IUT 2A\C++\imagestl\image.h no matching function for call to `transform(__gnu_cxx::__normal_iterator<const char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<const char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<const char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, )'

Apparemment le compilo ne reconnait pas la fonction tolower...

Pourquoi vaut-il mieux utiliser std:: un peu partout que using namespace std ?
Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
2
Essaie de compiler juste le petit programme suivant , pour voir...

#include <cctype>
#include
#include <string>
#include <set>
#include

int main()
{
    std::set<std::string> ss;

    ss.insert( "ABOUDABI" );
    ss.insert( "PariS" );
    ss.insert( "NewYork" );
    ss.insert( "OUAGADOUGOU" );

    for ( std::set<std::string>::iterator it = ss.begin() ; it != ss.end() ; it++ )
    {
        std::transform( it->begin() , it->end() , it->begin() , tolower );
    }

    std::copy( ss.begin() , ss.end() , std::ostream_iterator<std::string>( std::cout , "\n" ) );
}

Si ce programme marche, c'est que le problème est ailleurs ( peut-être dans tes fichiers cpp ), auquel cas, je t'invite à les mettre dans ce post. Sinon, j'essaierais de compiler sous gnu.
Messages postés
4
Date d'inscription
mercredi 29 octobre 2008
Statut
Membre
Dernière intervention
29 octobre 2008

Ce programme ne compile pas non plus.
L'erreur est la même.
J'ai même une autre erreur : `ostream_iterator' is not a member of `std'

Sinon tu n'as pas répondu à ma question concernant les std::

Merci d'avance ;)
Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
2
Quant aux std::, il y a deux bonnes raisons pour les laisser dans les headers :
1 - les namespaces sont faits pour empêcher les conflits de nommage des types, et les headers sont justement susceptibles d'être inclus dans plusieurs sources. Si tu laisses std:: dans le header, le source client, en cas de conflit, a la possiblité de se dépatouiller en jouant sur les namespaces, mais si tu ne le fais pas, le source client ne pourra pas utiliser ta classe.
2 - en cas de portage, tu seras content d'avoir une clé de recherche tel que "std::" pour rechercher et remplacer rapidement les types clé de la stl.
Messages postés
4
Date d'inscription
mercredi 29 octobre 2008
Statut
Membre
Dernière intervention
29 octobre 2008

Merci pour ces précisions Lucky92, ça fait plaisir d'avoir des réponses claires et rapides :)
Messages postés
116
Date d'inscription
jeudi 22 juillet 2004
Statut
Membre
Dernière intervention
14 juin 2012

Je crois que j'ai lu que l'on devait juste réinitialiser les iterateurs du set lorsqu'on modifiait l'un des membres du conteneur...

A ver!