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

STL map erase

3 réponses
Avatar
Mathieu Peyréga
Bonsoir

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é...

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 ?

Cordialement

Mathieu

3 réponses

Avatar
Vincent Lascaux
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

Avatar
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

Avatar
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 ?


work-around simple, à première vue :

themap_type::iterator_type iter2 = iter;
++iter2;
themap.erase (iter);

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