begin process at 2012 02 12 23:47:42
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Divers

 > 

Set transform C++


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Set transform C++

mercredi 29 octobre 2008 à 15:26:38 | Set transform C++

ffenforce10

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 <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.
mercredi 29 octobre 2008 à 20:23:24 | Re : Set transform C++

Lucky92

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 );
    }




mercredi 29 octobre 2008 à 21:01:45 | Re : Set transform C++

ffenforce10

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> > >, <unknown type>)'

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

Pourquoi vaut-il mieux utiliser std:: un peu partout que using namespace std ?
mercredi 29 octobre 2008 à 21:29:03 | Re : Set transform C++

Lucky92

Essaie de compiler juste le petit programme suivant , pour voir...

#include <cctype>
#include <iostream>
#include <string>
#include <set>
#include <algorithm>

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.
mercredi 29 octobre 2008 à 21:36:19 | Re : Set transform C++

ffenforce10

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 ;)
mercredi 29 octobre 2008 à 21:41:12 | Re : Set transform C++

Lucky92

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.
mercredi 29 octobre 2008 à 22:30:13 | Re : Set transform C++

Lucky92

Réponse acceptée !
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...

mercredi 29 octobre 2008 à 22:48:52 | Re : Set transform C++

ffenforce10

Merci pour ces précisions Lucky92, ça fait plaisir d'avoir des réponses claires et rapides :)
lundi 28 juin 2010 à 18:55:14 | Re : Set transform C++

HSylvio

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!




Cette discussion est classée dans : string, image, include, to, std


Répondre à ce message

Sujets en rapport avec ce message

Probleme EDL (VC++7) [ par vecchio56 ] Bonjour J'ai deux problèmes d'edition de liens: Dialog.obj : error LNK2001: symbole externe non résolu "public: void __thiscall std::_String_base::_X std::string to LowerCase [ par TeLeTUbIz ] Salut !   Ayant la fleme de programmer cet algo, je voudrais savoir si qqu'un connait une méthode rapide de changement de casse d'un std::string.Voilà Template qui fonctionne pas ? [ par Cethywolf ] Voilà, j'ai une fonction template qui fonctionne très bien toute seule, mais dés que je l'inclue dans une classe, j'ai une erreur de spécialisation .. pb conversion CString string pour affichage ds combobox [ par phenix6942 ] bonjour à tousje realise un projet mfc dans lequel j utilise plusieurs boites de dialogue.dans une de ces boites je souhaite afficher des string dans La class string [ par jderf ] Je suis débutant et je teste la class string. Voici un code tous simple, mais y'a un probleme de conversion à la compil que je ne comprend pas. Les er Compiler un programme écrit en C++ utilisant une bibliothèque C. Erreurs... [ par Virus721 ] Bonjour tout le monde ! :) Voila j'essaye de me coder un petit jeu avec la bibliothèque SDL 1.2 et l'aide du site du zéro. J'essaye autant que possib lire chaîne ligne par ligne [ par mervat ] bonjour, je veux lire une chaîne (std::string) ligne par ligne, j'ai pas pu le faire avec std::getline car ça marche avec les fichiers (std::ifstream) detection des petites cercles dans une image avec opencv [ par swito ] salut je travaille sur un projet qui consiste à détecter les petites cercles manométriques dans les images , j'ai utilisé la fonction cvHoughCircles Problème avec pointeurs private dans une classe [ par vvdbvivien07 ] Bonjour, Je suis en train de réaliser un traitement d'image en c++ et voici mon problème: L'utilisateur doit rentrer le nom d'un fichier pgm et le pr traiter plusieurs fichiers dans un dossier [ par mervat ] bonjour, je veux faire les mêmes traitements pour chaque fichier d'un dossier, je vais donner un exemple pour que vous me comprenez plus: supposons qu


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,357 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales