insertion dans une std::list à partir d'un reverse_iterator

insertion dans une std::list à partir d'un reverse_iterator - C++ - Programmation

Marsh Posté le 09-09-2004 à 09:54:58    

bonjour,
 
une question que je n'arrive pas à résoudre:
j'instancie une liste, par exemple avec des entiers.
 
std::list<int> maliste;
 
puis je mets des entiers dedans. Pour mettre ces entiers, je voudrais parcourir la liste depuis la fin vers le début, car je sais que j'ai plus de chances de devoir insérer mon élément vers la fin de la liste ; j'utilise donc un reverse_iterator pour parcourir ma liste à partir de la fin. Seulement voilà : une fois que j'ai trouvé l'endroit où je dois insérer mon élément, je suis bloqué car :
 
  comment réaliser une opération d'insertion dans une liste à partir d'un reverse_iterator?
 
la méthode 'insert' n'accepte que des iterateurs non-reverse... Cela veut-il dire que je suis obligé de parcourir ma liste depuis le début vers la fin et pas l'inverse?

Reply

Marsh Posté le 09-09-2004 à 09:54:58   

Reply

Marsh Posté le 09-09-2004 à 10:21:30    

Oui, c'est un peu le bordel. Mais pour les std::list, tu n'as pas besoin de reverse_iterator : un list<T>::iterator suffit, car il est bi-directionnel.
 

Code :
  1. std::list<int> l;
  2.   std::list<int>::iterator it = l.end();
  3.   it--;
  4.   l.insert(it, 3);


Reply

Marsh Posté le 09-09-2004 à 10:36:07    

ah oui, t'as raison.
merci :)

Reply

Marsh Posté le 09-09-2004 à 11:08:32    

Comment déduire qu'un container bidirectionnel permet ce que tu as décris?
 
J'utilise la doc de SGI, et tout ce que je vois à ce propos est q'un container bidirectionnel supporte les iterator et les reverse_iterator.
 
Par contre, je ne trouve rien qui me garantisse que décrémenter un itérateur initialisé avec end() ramène à un itérateur sur le dernier élément valide. Je trouve ça louche, quand même...


Message édité par SoWhatIn22 le 09-09-2004 à 11:09:01
Reply

Marsh Posté le 09-09-2004 à 11:19:20    

SoWhatIn22 a écrit :

Par contre, je ne trouve rien qui me garantisse que décrémenter un itérateur initialisé avec end() ramène à un itérateur sur le dernier élément valide. Je trouve ça louche, quand même...


 
Disons qu'un reversible container te dit que ton iterator et reverse_iterator doivent être bi-directionnels. Il n'impose pas que le reverse-iterator serve à quoi que ce soit (ce qui est d'ailleurs le cas: il sert juste à écrire ++ au lieu de --, la belle affaire  ;) ).
 
Après, end() est défini comme la position qui se trouve immédiatement après le dernier élément. Ca implique forcément que "end()-1" est le dernier élément (sinon ça ne serait pas la position immédiatement après, en raisonnant par l'absurde).
 
Je sais que c'est conceptuellement pas forcément évident (ça l'est encore moins avec les std::set et std::map), mais c'est comme ça.

Reply

Marsh Posté le 09-09-2004 à 11:35:03    

tu peux utiliser rend()

Reply

Marsh Posté le 09-09-2004 à 11:40:40    

Taz a écrit :

tu peux utiliser rend()


sauf que rend() me renvoie un reverse_iterator, que je ne peux pas convertir en simple iterator. C'est bien là tout mon probème. En fait, les reverse_iterator ne sont utilisables que pour consultation d'une liste, mais pas pour la modification (comme l'insertion ou la suppression d'un élément). Et c'est bien dommage


Message édité par SoWhatIn22 le 09-09-2004 à 11:41:12
Reply

Marsh Posté le 09-09-2004 à 12:07:10    

SoWhatIn22 a écrit :

sauf que rend() me renvoie un reverse_iterator, que je ne peux pas convertir en simple iterator. C'est bien là tout mon probème. En fait, les reverse_iterator ne sont utilisables que pour consultation d'une liste, mais pas pour la modification (comme l'insertion ou la suppression d'un élément). Et c'est bien dommage


Ah non ce n'est pas un "simple" iterator. C'est un iterateur bi-directionnel, non-aléatoire, et non-const. Ce n'est pas parce que le nom de la classe est simple que la classe elle-même l'est.
 
Donc je ne vois pas de problèmes en fait: iterator fait tout ce que tu désires, et est accepté par la majorité des fonctions, alors que reverse-iterator n'est accepté nul part, et a même une sémantique d'edit un peu différente.
 
Il ne faut pas confondre le concept d'un itérateur qui peut aller dans le sens inverse (tout iterateur bi-directionnel dans ce cas ci), avec le conccept d'un itérateur qu'on incrémente pour aller de droite à gauche (uniquement le reverse-iterator).  
 
Reverse-iterator ne sert qu'à être utilisé par des fonctions génériques qui parcourent un container, lorsqu'on souhaite effectivement aller de la fin vers le début en utilisant l'opérateur d'incrémentation. Il n'a aucune autre utilité à ma connaissance.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed