Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
621 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°845693
SoWhatIn22
Posté le 09-09-2004 à 09:54:58  profilanswer
 

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?

mood
Publicité
Posté le 09-09-2004 à 09:54:58  profilanswer
 

n°845712
Lam's
Profil: bas.
Posté le 09-09-2004 à 10:21:30  profilanswer
 

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);


n°845720
SoWhatIn22
Posté le 09-09-2004 à 10:36:07  profilanswer
 

ah oui, t'as raison.
merci :)

n°845743
SoWhatIn22
Posté le 09-09-2004 à 11:08:32  profilanswer
 

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
n°845754
Lam's
Profil: bas.
Posté le 09-09-2004 à 11:19:20  profilanswer
 

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.

n°845779
Taz
bisounours-codeur
Posté le 09-09-2004 à 11:35:03  profilanswer
 

tu peux utiliser rend()

n°845785
SoWhatIn22
Posté le 09-09-2004 à 11:40:40  profilanswer
 

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
n°845823
Lam's
Profil: bas.
Posté le 09-09-2004 à 12:07:10  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
list de telechargementgeneration de requetes sql a partir du code
Modification de site en PHP, insertion d'imageCaractères bizarres après insertion ds la db
envoi info à un ou word à partir du php - touche F1, F2 ???Du reverse engineering pour les classes Php ?
Comment retrouver la clé primaire d'une insertion toute fraîche ?probleme d insertion d un lien dans un mail
Executer un script shell sur un serveur unix distant a partir de winNTpb: écriture de données dans un formulaire à partir d'une popup
Plus de sujets relatifs à : insertion dans une std::list à partir d'un reverse_iterator


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR