Last Iterator

Le
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!
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
David Fleury
Le #16354831
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
David Fleury
Le #16354981
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()

?
James Kanze
Le #16355081
On Jul 17, 9:46 pm, David Fleury
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
David Fleury
Le #16355281
James Kanze a écrit :
On Jul 17, 9:46 pm, David Fleury
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
James Kanze
Le #16357101
On Jul 17, 10:39 pm, David Fleury
James Kanze a écrit :



> On Jul 17, 9:46 pm, David Fleury >> 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
Sylvain Togni
Le #16359311
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
David Fleury
Le #16365211
James Kanze a écrit :
On Jul 17, 10:39 pm, David Fleury
James Kanze a écrit :



On Jul 17, 9:46 pm, David Fleury
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
James Kanze
Le #16365361
On Jul 18, 9:51 pm, David Fleury
James Kanze a écrit :
> On Jul 17, 10:39 pm, David Fleury >> James Kanze a écrit :



>>> On Jul 17, 9:46 pm, David Fleury >>>> 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
Publicité
Poster une réponse
Anonyme