là ou STLPort et gcc implémentent void erase(iterator iter);
Je crois que c'est cette méthode qui est reconnue.
themap.erase(iter); ++iter;
Non. Apres themap.erase(iter), iter est invalide. On ne peut plus faire ++iter. La méthode est de passer par une variable temporaire :
iterator temp = iter; ++iter; themap.erase(temp);
Ce code est exactement équivalent à
themap.erase(iter++);
-- Vincent
Loïc Joly
Mathieu Peyréga wrote:
Bonsoir
quelle est l'interface "ISO" des méthode erase de std::map<>
La norme dit : void erase(iterator position); size_type erase(const key_type& x); void erase(iterator first, iterator last);
A propos de ce problème, est-il résolu en faisant
themap.erase(iter); ++iter;
Non,
The insert members shall not affect the validity of iterators and references to the container, and the erase members shall invalidate only iterators and references to the erased elements.
Il vaut mieux faire theMap.erase(iter++);
-- Loïc
Mathieu Peyréga wrote:
Bonsoir
quelle est l'interface "ISO" des méthode erase de std::map<>
La norme dit :
void erase(iterator position);
size_type erase(const key_type& x);
void erase(iterator first, iterator last);
A propos de ce problème, est-il résolu en faisant
themap.erase(iter);
++iter;
Non,
The insert members shall not affect the validity of iterators and
references to the container, and the erase
members shall invalidate only iterators and references to the erased
elements.
quelle est l'interface "ISO" des méthode erase de std::map<>
La norme dit : void erase(iterator position); size_type erase(const key_type& x); void erase(iterator first, iterator last);
A propos de ce problème, est-il résolu en faisant
themap.erase(iter); ++iter;
Non,
The insert members shall not affect the validity of iterators and references to the container, and the erase members shall invalidate only iterators and references to the erased elements.
Il vaut mieux faire theMap.erase(iter++);
-- Loïc
Gourgouilloult
Pour commencer :
A propos de ce problème, est-il résolu en faisant themap.erase(iter); ++iter;
là ou je faisait iter = themap.erase(iter); avec Visual ?
C'est lourd, mais ça pourrait le faire, non ? Pour la solution en erase() puis ++, j'y crois pas trop... (demander à un itérateur invalide qui est son voisin, bof)
(J'étais en train de me demander comment il avait pu m'arriver de faire... en fait, itérer sur une map, surtout pour supprimer des éléments au passage, c'est pas le mode d'accès le plus commun.)
quelle est l'interface "ISO" des méthode erase de std::map<> MSVC 6 implémente : iterator erase(iterator iter);
là ou STLPort et gcc implémentent void erase(iterator iter);
ce qui m'a posé un problème de portabilité...
Alors la norme a l'air de dire : void erase (iterator); size_type erase (const key_type&); void erase (iterator first, iterator last);
L'ennui, avec la norme, c'est qu'elle ne peut pas faire grand chose dans ce genre de cas. Quoiqu'elle dise, si une implémentation ou une autre veut faire autrement sur tel ou tel point...
Néanmoins, on a de la chance : le comportement normal (pour le cas «sous la main») est celui qui se base sur le service minimum.
Cela dit, je crois avoir déjà vu passer cette discussion quelque fois, déjà, donc peut-être qu'un petit tour dans les archives... ;)
Cordialement Mathieu
Gourgou Pareil ;)
Pour commencer :
A propos de ce problème, est-il résolu en faisant
themap.erase(iter);
++iter;
là ou je faisait
iter = themap.erase(iter); avec Visual ?
C'est lourd, mais ça pourrait le faire, non ?
Pour la solution en erase() puis ++, j'y crois pas trop... (demander à
un itérateur invalide qui est son voisin, bof)
(J'étais en train de me demander comment il avait pu m'arriver de
faire... en fait, itérer sur une map, surtout pour supprimer des
éléments au passage, c'est pas le mode d'accès le plus commun.)
quelle est l'interface "ISO" des méthode erase de std::map<>
MSVC 6 implémente :
iterator erase(iterator iter);
là ou STLPort et gcc implémentent
void erase(iterator iter);
ce qui m'a posé un problème de portabilité...
Alors la norme a l'air de dire :
void erase (iterator);
size_type erase (const key_type&);
void erase (iterator first, iterator last);
L'ennui, avec la norme, c'est qu'elle ne peut pas faire grand chose dans
ce genre de cas. Quoiqu'elle dise, si une implémentation ou une autre
veut faire autrement sur tel ou tel point...
Néanmoins, on a de la chance : le comportement normal (pour le cas «sous
la main») est celui qui se base sur le service minimum.
Cela dit, je crois avoir déjà vu passer cette discussion quelque fois,
déjà, donc peut-être qu'un petit tour dans les archives... ;)
C'est lourd, mais ça pourrait le faire, non ? Pour la solution en erase() puis ++, j'y crois pas trop... (demander à un itérateur invalide qui est son voisin, bof)
(J'étais en train de me demander comment il avait pu m'arriver de faire... en fait, itérer sur une map, surtout pour supprimer des éléments au passage, c'est pas le mode d'accès le plus commun.)
quelle est l'interface "ISO" des méthode erase de std::map<> MSVC 6 implémente : iterator erase(iterator iter);
là ou STLPort et gcc implémentent void erase(iterator iter);
ce qui m'a posé un problème de portabilité...
Alors la norme a l'air de dire : void erase (iterator); size_type erase (const key_type&); void erase (iterator first, iterator last);
L'ennui, avec la norme, c'est qu'elle ne peut pas faire grand chose dans ce genre de cas. Quoiqu'elle dise, si une implémentation ou une autre veut faire autrement sur tel ou tel point...
Néanmoins, on a de la chance : le comportement normal (pour le cas «sous la main») est celui qui se base sur le service minimum.
Cela dit, je crois avoir déjà vu passer cette discussion quelque fois, déjà, donc peut-être qu'un petit tour dans les archives... ;)