Set transform C++

Résolu
ffenforce10 Messages postés 4 Date d'inscription mercredi 29 octobre 2008 Statut Membre Dernière intervention 29 octobre 2008 - 29 oct. 2008 à 15:26
HSylvio Messages postés 116 Date d'inscription jeudi 22 juillet 2004 Statut Membre Dernière intervention 14 juin 2012 - 28 juin 2010 à 18:55
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

cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 2
29 oct. 2008 à 22:30
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...
3
cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 2
29 oct. 2008 à 20:23
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 );
    }
0
ffenforce10 Messages postés 4 Date d'inscription mercredi 29 octobre 2008 Statut Membre Dernière intervention 29 octobre 2008
29 oct. 2008 à 21:01
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 ?
0
cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 2
29 oct. 2008 à 21:29
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ffenforce10 Messages postés 4 Date d'inscription mercredi 29 octobre 2008 Statut Membre Dernière intervention 29 octobre 2008
29 oct. 2008 à 21:36
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 ;)
0
cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 2
29 oct. 2008 à 21:41
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.
0
ffenforce10 Messages postés 4 Date d'inscription mercredi 29 octobre 2008 Statut Membre Dernière intervention 29 octobre 2008
29 oct. 2008 à 22:48
Merci pour ces précisions Lucky92, ça fait plaisir d'avoir des réponses claires et rapides :)
0
HSylvio Messages postés 116 Date d'inscription jeudi 22 juillet 2004 Statut Membre Dernière intervention 14 juin 2012
28 juin 2010 à 18:55
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!
0
Rejoignez-nous