Forme du prédicat pour l'algorithme sort ?
Le
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"0 -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
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"0 -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

Poser une question


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.
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 }
lMess.sort(getNewestMessage);
Sauf que std::sort prend des RandomAccessIterators, d'où le sort de
std::list.
Patrick Mézard
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)
-> poubelle.
--
;-)
Ptêt que la norme a changé ...