Bonjour, c'est encore moi.
J'utilise un std::set, et j'aimerais une fonction comme upper_bound
(rechercher >) mais dans l'autre sens (rechercher <). lower_bound est
plutot un piège à ce sujet (rechercher >=).
Soit ma fonction previous_bound qui recherche le premier élément d'un set
strictement inférieur à celui donné.
J'ai fait ça (oubliez la version template et la vérification d'erreur) :
typedef std::set<int> Set;
// trouve la valeur du set juste en dessous de celle donnée
int previous_bound( const Set & S, int Val )
{
Set::const_iterator i =
std::find_if(
S.rbegin(),
S.rend(),
std::bind1st( std::less<int>(), Val ) );
return *i;
}
Mais il (g++, VC++) n'est pas content:
"impossible de convertir de const_reverse_iterator en const_iterator"
Moi qui croyais qu'un reverse_iterator pouvait s'utiliser à la place d 'un
iterator je suis déçu, et embêté. Comment faire ça simplement ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Falk Tannhäuser
Aurélien REGAT-BARREL wrote:
typedef std::set<int> Set;
// trouve la valeur du set juste en dessous de celle donnée int previous_bound( const Set & S, int Val ) { Set::const_iterator i = std::find_if( S.rbegin(), S.rend(), std::bind1st( std::less<int>(), Val ) ); return *i; }
Mais il (g++, VC++) n'est pas content: "impossible de convertir de const_reverse_iterator en const_iterator"
Moi qui croyais qu'un reverse_iterator pouvait s'utiliser à la place d 'un iterator je suis déçu, et embêté. Comment faire ça simplement ?
Il n'y a pas de conversion implicite de (const_)reverse_iterator en (const_)iterator ; il faut appeler la fonction membre base() pour cela et faire attention au fait que si 'i' est un itérateur, alors reverse_iterator(i) désigne le même élément que i-1. Dans le cas présent, cette conversion n'est pas nécessaire, il suffit d'affecter le résultat de std::find_if() à un variable du bon type (Set::const_reverse_iterator plutôt qu'à un Set::const_iterator).
De plus, je pense que tu veux std::greater à la place de std::less.
Falk
Aurélien REGAT-BARREL wrote:
typedef std::set<int> Set;
// trouve la valeur du set juste en dessous de celle donnée
int previous_bound( const Set & S, int Val )
{
Set::const_iterator i =
std::find_if(
S.rbegin(),
S.rend(),
std::bind1st( std::less<int>(), Val ) );
return *i;
}
Mais il (g++, VC++) n'est pas content:
"impossible de convertir de const_reverse_iterator en const_iterator"
Moi qui croyais qu'un reverse_iterator pouvait s'utiliser à la place d 'un
iterator je suis déçu, et embêté. Comment faire ça simplement ?
Il n'y a pas de conversion implicite de (const_)reverse_iterator en
(const_)iterator ; il faut appeler la fonction membre base() pour cela
et faire attention au fait que si 'i' est un itérateur, alors
reverse_iterator(i) désigne le même élément que i-1.
Dans le cas présent, cette conversion n'est pas nécessaire, il suffit
d'affecter le résultat de std::find_if() à un variable du bon type
(Set::const_reverse_iterator plutôt qu'à un Set::const_iterator).
De plus, je pense que tu veux std::greater à la place de std::less.
// trouve la valeur du set juste en dessous de celle donnée int previous_bound( const Set & S, int Val ) { Set::const_iterator i = std::find_if( S.rbegin(), S.rend(), std::bind1st( std::less<int>(), Val ) ); return *i; }
Mais il (g++, VC++) n'est pas content: "impossible de convertir de const_reverse_iterator en const_iterator"
Moi qui croyais qu'un reverse_iterator pouvait s'utiliser à la place d 'un iterator je suis déçu, et embêté. Comment faire ça simplement ?
Il n'y a pas de conversion implicite de (const_)reverse_iterator en (const_)iterator ; il faut appeler la fonction membre base() pour cela et faire attention au fait que si 'i' est un itérateur, alors reverse_iterator(i) désigne le même élément que i-1. Dans le cas présent, cette conversion n'est pas nécessaire, il suffit d'affecter le résultat de std::find_if() à un variable du bon type (Set::const_reverse_iterator plutôt qu'à un Set::const_iterator).
De plus, je pense que tu veux std::greater à la place de std::less.
Falk
Aurélien REGAT-BARREL
Il n'y a pas de conversion implicite de (const_)reverse_iterator en (const_)iterator ; il faut appeler la fonction membre base() pour cela et faire attention au fait que si 'i' est un itérateur, alors reverse_iterator(i) désigne le même élément que i-1. Dans le cas présent, cette conversion n'est pas nécessaire, il suffit d'affecter le résultat de std::find_if() à un variable du bon type (Set::const_reverse_iterator plutôt qu'à un Set::const_iterator).
Pffff, mais quel idiot. Je croyais que l'erreur était dans les paramètres du template, j'avais pas vu mon mauvais type auquel j'affecte le résultat. Ca me rassure sur l'utlisation des reverse_iterator. Tout est ok maintenant.
De plus, je pense que tu veux std::greater à la place de std::less.
Oui, en fait c'est plutot bind2nd que je voulais utiliser. C'est corrigé. Les tests sont ok. Merci.
-- Aurélien REGAT-BARREL
Il n'y a pas de conversion implicite de (const_)reverse_iterator en
(const_)iterator ; il faut appeler la fonction membre base() pour cela
et faire attention au fait que si 'i' est un itérateur, alors
reverse_iterator(i) désigne le même élément que i-1.
Dans le cas présent, cette conversion n'est pas nécessaire, il suffit
d'affecter le résultat de std::find_if() à un variable du bon type
(Set::const_reverse_iterator plutôt qu'à un Set::const_iterator).
Pffff, mais quel idiot. Je croyais que l'erreur était dans les paramètres du
template, j'avais pas vu mon mauvais type auquel j'affecte le résultat. Ca
me rassure sur l'utlisation des reverse_iterator. Tout est ok maintenant.
De plus, je pense que tu veux std::greater à la place de std::less.
Oui, en fait c'est plutot bind2nd que je voulais utiliser. C'est corrigé.
Les tests sont ok.
Merci.
Il n'y a pas de conversion implicite de (const_)reverse_iterator en (const_)iterator ; il faut appeler la fonction membre base() pour cela et faire attention au fait que si 'i' est un itérateur, alors reverse_iterator(i) désigne le même élément que i-1. Dans le cas présent, cette conversion n'est pas nécessaire, il suffit d'affecter le résultat de std::find_if() à un variable du bon type (Set::const_reverse_iterator plutôt qu'à un Set::const_iterator).
Pffff, mais quel idiot. Je croyais que l'erreur était dans les paramètres du template, j'avais pas vu mon mauvais type auquel j'affecte le résultat. Ca me rassure sur l'utlisation des reverse_iterator. Tout est ok maintenant.
De plus, je pense que tu veux std::greater à la place de std::less.
Oui, en fait c'est plutot bind2nd que je voulais utiliser. C'est corrigé. Les tests sont ok. Merci.