Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Last Iterator

8 réponses
Avatar
Guillaume GOURDIN
Bonjour à tous,

quel est le moyen le plus élégant de récupérer un iterator (et pas un
reverse_iterator) sur le dernier élément d'une std::list?

Merci!

8 réponses

Avatar
David Fleury
Guillaume GOURDIN a écrit :
Bonjour à tous,

quel est le moyen le plus élégant de récupérer un iterator (et pas un
reverse_iterator) sur le dernier élément d'une std::list?




(++l.rbegin()).base()

?

David
Avatar
David Fleury
David Fleury a écrit :
Guillaume GOURDIN a écrit :
Bonjour à tous,

quel est le moyen le plus élégant de récupérer un iterator (et pas un
reverse_iterator) sur le dernier élément d'une std::list?




(++l.rbegin()).base()




ou


--l.end()

?
Avatar
James Kanze
On Jul 17, 9:46 pm, David Fleury wrote:
Guillaume GOURDIN a écrit :



> quel est le moyen le plus élégant de récupérer un iterator
> (et pas un reverse_iterator) sur le dernier élément d'une
> std::list?



(++l.rbegin()).base()



?



Pour utiliser l'opérateur ++ sur un itérateur, il faut un
lvalue. Sinon, ça pourrait marcher, comme ça pourrait ne pas
marcher.

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Avatar
David Fleury
James Kanze a écrit :
On Jul 17, 9:46 pm, David Fleury wrote:
Guillaume GOURDIN a écrit :



quel est le moyen le plus élégant de récupérer un iterator
(et pas un reverse_iterator) sur le dernier élément d'une
std::list?





(++l.rbegin()).base()



?



Pour utiliser l'opérateur ++ sur un itérateur, il faut un
lvalue. Sinon, ça pourrait marcher, comme ça pourrait ne pas
marcher.



C'est un peu trop rapide pour moi.
J'arrive pas à trouver quand ça n'est pas la cas ?

David
Avatar
James Kanze
On Jul 17, 10:39 pm, David Fleury wrote:
James Kanze a écrit :



> On Jul 17, 9:46 pm, David Fleury wrote:
>> Guillaume GOURDIN a écrit :



>>> quel est le moyen le plus élégant de récupérer un iterator
>>> (et pas un reverse_iterator) sur le dernier élément d'une
>>> std::list?



>> (++l.rbegin()).base()



>> ?



> Pour utiliser l'opérateur ++ sur un itérateur, il faut un
> lvalue. Sinon, ça pourrait marcher, comme ça pourrait ne pas
> marcher.



C'est un peu trop rapide pour moi.
J'arrive pas à trouver quand ça n'est pas la cas ?



Quand l'implémentation ne le supporte pas. Si l'« itérateur »
n'est qu'un typedef à un pointeur, par exemple (comme c'était le
cas pour std::vector<>::iterator dans beaucoup des premières
implémentations), ou si l'opérateur ++ n'est pas membre.

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Avatar
Sylvain Togni
Guillaume GOURDIN a écrit :

Bonjour à tous,

quel est le moyen le plus élégant de récupérer un iterator (et pas un
reverse_iterator) sur le dernier élément d'une std::list?



boost::prior(list.end())

--
Sylvain Togni
Avatar
David Fleury
James Kanze a écrit :
On Jul 17, 10:39 pm, David Fleury wrote:
James Kanze a écrit :



On Jul 17, 9:46 pm, David Fleury wrote:
Guillaume GOURDIN a écrit :







quel est le moyen le plus élégant de récupérer un iterator
(et pas un reverse_iterator) sur le dernier élément d'une
std::list?









(++l.rbegin()).base()







?







Pour utiliser l'opérateur ++ sur un itérateur, il faut un
lvalue. Sinon, ça pourrait marcher, comme ça pourrait ne pas
marcher.





C'est un peu trop rapide pour moi.
J'arrive pas à trouver quand ça n'est pas la cas ?



Quand l'implémentation ne le supporte pas. Si l'« itérateur »
n'est qu'un typedef à un pointeur, par exemple (comme c'était le
cas pour std::vector<>::iterator dans beaucoup des premières
implémentations), ou si l'opérateur ++ n'est pas membre.




Ok pour le premier point, mais le deuxième, la norme n'impose
pas l'opérateur ++ d'être membre ?
On va dire que non alors.

L'utilisation de boost semble plus élégante (bon faut installer boost)

David
Avatar
James Kanze
On Jul 18, 9:51 pm, David Fleury wrote:
James Kanze a écrit :
> On Jul 17, 10:39 pm, David Fleury wrote:
>> James Kanze a écrit :



>>> On Jul 17, 9:46 pm, David Fleury wrote:
>>>> Guillaume GOURDIN a écrit :



>>>>> quel est le moyen le plus élégant de récupérer un iterator
>>>>> (et pas un reverse_iterator) sur le dernier élément d'une
>>>>> std::list?



>>>> (++l.rbegin()).base()



>>>> ?



>>> Pour utiliser l'opérateur ++ sur un itérateur, il faut un
>>> lvalue. Sinon, ça pourrait marcher, comme ça pourrait ne pas
>>> marcher.



>> C'est un peu trop rapide pour moi.
>> J'arrive pas à trouver quand ça n'est pas la cas ?



> Quand l'implémentation ne le supporte pas. Si l'« itérateur »
> n'est qu'un typedef à un pointeur, par exemple (comme c'était le
> cas pour std::vector<>::iterator dans beaucoup des premières
> implémentations), ou si l'opérateur ++ n'est pas membre.



Ok pour le premier point, mais le deuxième, la norme n'impose
pas l'opérateur ++ d'être membre ?



Non.

On va dire que non alors.



L'utilisation de boost semble plus élégante (bon faut
installer boost)



Faute de quoi, c'est vraiment un petit template que trois ou
quatre lignes, qu'on doit pouvoir écrire soi-même.

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34