OVH Cloud OVH Cloud

Forme du prédicat pour l'algorithme sort ?

7 réponses
Avatar
Eric Bart
Bonjour,

Je cherche à utiliser sort avec un prédicat.

Je n'y arrive pas. Pourriez-vous svp me donner la
solution. Voici mon code:

------------------------
// conteneur list
struct message {
string fileName;
time_t fileTime;
};
list<struct message> lMess;

// prédicat
bool getNewestMessage(struct message & m1, struct message & m2)
{
if(m1.fileTime < m2.fileTime)
return true;

return false;
}

// ligne donnant l'erreur de compilation
lMess.sort(lMess.begin(),lMess.end(),getNewestMessage);
------------------------

Message du compilateur:
g++ -g -O0 -D VERSIONMAJOR=0 -D VERSIONMINOR=220 -c -o app_voiceblog.o app_voiceblog.c
app_voiceblog.c: In function `void initMessList()':
app_voiceblog.c:48: error: no matching function for call to `std::list<message, std::allocator<message>
>::sort(std::_List_iterator<message, message&, message*>, std::_List_iterator<message, message&, message*>, bool (&)(message&,
message&))'
/usr/include/c++/3.3.2/bits/list.tcc:251: error: candidates are: void std::list<_Tp, _Alloc>::sort() [with _Tp = message, _Alloc =
std::allocator<message>]
make[1]: *** [app_voiceblog.o] Error 1
make[1]: Target `all' not remade because of errors.
make[1]: Leaving directory `/root/dev/axra'

Compilation exited abnormally with code 2 at Wed Dec 8 23:58:04

7 réponses

Avatar
Twxs
Eric Bart wrote:
Bonjour,

// ligne donnant l'erreur de compilation
lMess.sort(lMess.begin(),lMess.end(),getNewestMessage);
------------------------



il est tard, et je n'ai pas le courage de verifier, mais il me semble
que la methode sort de list ne prend pas de parametre.

par contre la fonction std::sort prend elle 2 iterateurs et un predicat

donc c'est soit
lMess.sort();
en definissant l'operateur de comparaison de 2 struct Message

soit
sort(lMess.begin(), lMess.end(), getNewestMessage);


Bonne continuation,
nicolas.

Avatar
Patrick Mézard
Twxs wrote:
Eric Bart wrote:

Bonjour,



// ligne donnant l'erreur de compilation
lMess.sort(lMess.begin(),lMess.end(),getNewestMessage);
------------------------




il est tard, et je n'ai pas le courage de verifier, mais il me semble
que la methode sort de list ne prend pas de parametre.


D'après http://www.sgi.com/tech/stl/List.html, il existe une version
prenant un BinaryPredicate en paramètre. En revanche, elle ne prend pas
d'itérateurs, elle travaille sur la liste complète donc :

inline bool getNewestMessage(const message & m1, const message & m2)
{
return m1.fileTime < m2.fileTime;
}

lMess.sort(getNewestMessage);


par contre la fonction std::sort prend elle 2 iterateurs et un predicat

donc c'est soit
lMess.sort();
en definissant l'operateur de comparaison de 2 struct Message

soit
sort(lMess.begin(), lMess.end(), getNewestMessage);


Sauf que std::sort prend des RandomAccessIterators, d'où le sort de
std::list.

Patrick Mézard


Avatar
Eric Bart
"Patrick Mézard" wrote in message news:41b7fd23$0$11777$
D'après http://www.sgi.com/tech/stl/List.html, il existe une version
prenant un BinaryPredicate en paramètre. En revanche, elle ne prend pas
d'itérateurs, elle travaille sur la liste complète donc :

inline bool getNewestMessage(const message & m1, const message & m2)
{
return m1.fileTime < m2.fileTime;
}

lMess.sort(getNewestMessage);


Oui. Ca marche. Merci.

C'est bizarre, je m'étais basé sur mon bouquin C++ Delannoy 4° édition page 563.
void(sort(Ia début, Ia fin, fct_comp)

Avatar
Fabien LE LEZ
On Thu, 9 Dec 2004 09:32:06 +0100, "Eric Bart"
:

Delannoy


-> poubelle.


--
;-)

Avatar
Eric Bart
"Fabien LE LEZ" wrote in message news:

Delannoy


-> poubelle.


Ptêt que la norme a changé ...


Avatar
Andre Heinen
On Thu, 9 Dec 2004 10:13:40 +0100, "Eric Bart"
wrote:

"Fabien LE LEZ" wrote in message news:

Delannoy


-> poubelle.


Ptêt que la norme a changé ...


Quand bien même ce serait le cas, avec Delannoy, tu auras
d'autres mauvaises surprises.

--
Andre Heinen
My address, rot13-encoded: n qbg urvara ng rhebcrnayvax qbg pbz



Avatar
Fabien LE LEZ
Si tu veux savoir ce que les lecteurs de fr.comp.lang.c++ pensent de
Delannoy (ou de tout autre sujet, d'ailleurs), Google est ton ami.

<http://groups-beta.google.com/groups?as_qÞlannoy&as_ugroup=fr.comp.lang.c%2B%2B>


--
;-)