C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

spécification de la fonction de comparaison des conteneurs d

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Frédéric Gourul
Guest





PostPosted: Mon Jan 12, 2004 10:37 pm    Post subject: spécification de la fonction de comparaison des conteneurs d Reply with quote



Bonsoir,

Une question bien précise sur laquelle je bloque. Je souhaite stocker des
pointeurs de ma classe dans un conteneur (std::set). Seulement je voudrais
que la fonction d'ordre du conteneur soit celle de ma classe et non les
adresses de pointeurs comme c'est le cas actuellement.

class CTest
{
private:
int priority;
public:
CTest(int priority) :priority(priority) {}
int getPriority() const {return priority;}
};
ostream& operator<<(ostream& s, const CTest m) {s << "CTest - " <<
m.getPriority(); return s;}
bool operator<(const CTest m1, const CTest m2) {return (m1.getPriority() <
m2.getPriority());}
bool operator>(const CTest m1, const CTest m2) {return (m1.getPriority() >
m2.getPriority());}
bool operator==(const CTest m1, const CTest m2) {return (m1.getPriority() ==
m2.getPriority());}
bool operator<=(const CTest m1, const CTest m2) {return (m1.getPriority() <=
m2.getPriority());}
bool operator>=(const CTest m1, const CTest m2) {return (m1.getPriority() >=
m2.getPriority());}

si je fais:
.....
CTest t1(Cool, t2(5), t3(13), t4(9);
std::set<CTest*> queue;
queue.insert(&t1);
queue.insert(&t2);
queue.insert(&t3);
queue.insert(&t4);
std::set<CTest*>::iterator it = queue.begin();
while(it != queue.end()) cout << **it++ << "; ";
cout << endl;

j'obtiens ceci comme résultat, ce qui est normal...
CTest - 9; CTest - 13; CTest - 5; CTest - 8;

or moi je veux:
CTest - 5; CTest - 8; CTest - 9; CTest - 13;

je sais que je doit spécifier la fonction de comparaison en deuxième
paramètre du template, mais j'ignore comme faire cela... Je n'arrive même
pas à le faire avec une fonction globale...

merci de votre aide :)


Back to top
Fabien LE LEZ
Guest





PostPosted: Tue Jan 13, 2004 12:03 am    Post subject: Re: spécification de la fonction de comparaison des conteneu Reply with quote



On Mon, 12 Jan 2004 23:37:21 +0100, "Frédéric Gourul"
<fgourul.nospam (AT) 9online (DOT) fr> wrote:

Quote:
class CTest
{
private:
int priority;
public:
CTest(int priority) :priority(priority) {}
int getPriority() const {return priority;}
};

bool CompareCTest (CTest* const& c1, CTest* const& c2)
{
return c1->getPriority() < c2->getPriority();
}

std::set <CTest*, CompareCTest> mon_set;

Au fait, le préfixe "C" est typique des classes de la MFC, il ne me
paraît pas utile (ni même bon) de l'utiliser pour tes propres classes.


--
;-)

http://www.gotw.ca/gotw/063.htm
http://www.gotw.ca/gotw/067.htm#2

Back to top
Fabien LE LEZ
Guest





PostPosted: Tue Jan 13, 2004 12:08 am    Post subject: Re: spécification de la fonction de comparaison des conteneu Reply with quote



On Tue, 13 Jan 2004 01:03:54 +0100, Fabien LE LEZ
<gramster (AT) gramster (DOT) com> wrote:
Quote:
bool CompareCTest (CTest* const& c1, CTest* const& c2)
{
return c1->getPriority() < c2->getPriority();
}

std::set <CTest*, CompareCTest> mon_set;

Ahem... On va dire que je ferais mieux d'aller me coucher :-(

La vraie syntaxe est bien sûr :

struct CompareCTest
{
bool operator()(CTest* const& c1, CTest* const& c2) const
{
return c1->getPriority() < c2->getPriority();
}
};

std::set <CTest*, CompareCTest> mon_set;

Celle que j'ai donnée précédemment ne fonctionne que comme paramètre
de fonction (std::sort par exemple).

--
;-)

http://www.gotw.ca/gotw/063.htm
http://www.gotw.ca/gotw/067.htm#2

Back to top
Frédéric Gourul
Guest





PostPosted: Tue Jan 13, 2004 7:00 am    Post subject: Re: spécification de la fonction de comparaison des conteneu Reply with quote


"Fabien LE LEZ" <gramster (AT) gramster (DOT) com> a écrit dans le message de
news:old6009e76r1d8le16ia84g5k2vljvemue (AT) 4ax (DOT) com...
Quote:
On Tue, 13 Jan 2004 01:03:54 +0100, Fabien LE LEZ
[email]gramster (AT) gramster (DOT) com[/email]> wrote:

Au fait, le préfixe "C" est typique des classes de la MFC, il ne me
paraît pas utile (ni même bon) de l'utiliser pour tes propres classes.

Exact. Aucune de mes classes n'utilise cette convention. Le "C" ici veut
juste dire "Classe Test"...

Quote:
std::set <CTest*, CompareCTest> mon_set;

Celle que j'ai donnée précédemment ne fonctionne que comme paramètre
de fonction (std::sort par exemple).

Merci. Effectivemment j'avais essayé "naturellement" la fonction que tu as
donné précédemment et j'ai bien vu que ce n'était pas ca... J'avoue que j'ai
un peu de mal avec les foncteurs... Une dernière question: il n'est pas
possible de lui spécifier l'opérateur de comparaison de ma classe ? Même si
je la déclare comme fonction membre: CTest::operator<(const CTest&) ?



Back to top
Fabien LE LEZ
Guest





PostPosted: Wed Jan 14, 2004 12:55 am    Post subject: Re: spécification de la fonction de comparaison des conteneu Reply with quote

On Tue, 13 Jan 2004 08:00:25 +0100, "Frédéric Gourul"
<fgourul.nospam (AT) 9online (DOT) fr> wrote:

Quote:
Une dernière question: il n'est pas
possible de lui spécifier l'opérateur de comparaison de ma classe ?

Non. std::set est défini à peu près comme suit :
template <class T, class Compare = std::less class set {...
Aussi, le deuxième paramètre du template doit impérativement être une
classe. Note : il pourrait plus généralement être un type, mais aucun
type de base ne convient ici.

A comparer avec :

template <class Iterateur, class Foncteur>
void sort (Iterateur debut, Iterateur fin, Foncteur f);

Tu peux passer une fonction comme paramètre, car ici le paramètre "f"
est un objet, pas un type (le type "Foncteur" est alors le type
"pointeur sur fonction").

La différence, c'est pour pour créer un objet d'une classe template,
tu dois préciser explicitement les paramètres templates, alors que
pour une fonction, ce n'est généralement pas nécessaire (Heureusement,
car souvent les pointeurs de fonctions sont pas piqués des hannetons
Wink ).

--
;-)

http://www.gotw.ca/gotw/063.htm
http://www.gotw.ca/gotw/067.htm#2

Back to top
Michel Michaud
Guest





PostPosted: Wed Jan 14, 2004 6:58 am    Post subject: Re: spécification de la fonction de comparaison des conteneu Reply with quote

Dans news:uf4900h4hnei6hslk3kccnce0vkr59hb6v (AT) 4ax (DOT) com, Fabien LE
LEZ <gramster (AT) gramster (DOT) com> a écrit :
Quote:
Non. std::set est défini à peu près comme suit :
template <class T, class Compare = std::less class set {...
Aussi, le deuxième paramètre du template doit impérativement être
une classe. Note : il pourrait plus généralement être un type, mais
aucun type de base ne convient ici.

A comparer avec :

template void sort (Iterateur debut, Iterateur fin, Foncteur f);

Tu peux passer une fonction comme paramètre, car ici le paramètre
"f" est un objet, pas un type (le type "Foncteur" est alors le type
"pointeur sur fonction").

Mais les constructeurs de set permettent de donner une fonction
de comparaison... d'une certaine façon ! (ce n'est pas vraiment
plus simple...)

--
Michel Michaud [email]mm (AT) gdzid (DOT) com[/email]
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/


Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.