Effacement d’un élément dans une boucle automatique for (-each)

Existe-t-il un moyen d’effacer des éléments spécifiques lors de l’utilisation d’une variable automatique dans une boucle for comme celle-ci?

for(auto a: m_Connections) { if(something) { //Erase this element } } 

Je sais que je peux soit dire

 for(auto it=m_map.begin() ... 

ou

 for(map::iterator it=m_map.begin() ... 

et incrémenter manuellement l’iterator (et effacer), mais si je pouvais le faire avec moins de lignes de code, je serais plus heureux.

Merci!

Non, il n’y en a pas. La boucle for basée sur la plage est utilisée pour accéder à chaque élément d’un conteneur une fois.

Chaque fois qu’un élément est supprimé du conteneur, les iterators situés à ou après l’élément supprimé ne sont plus valides (et étant donné l’implémentation de la plage, c’est un problème).

Vous devez utiliser la boucle for normale (ou un while ) si vous devez modifier le conteneur au fur et à mesure.

Si vous souhaitez effacer des éléments pour lesquels un prédicat renvoie true , true un bon moyen:

 m_Connections.erase( std::remove_if(m_Connections.begin(), m_Connections.end(), [](Type elem) { return predicate(elem); }), m_Connections.end()); 

std :: remove_if ne mélange pas la logique d’itération avec le prédicat.

Tu ne peux pas. Une boucle basée sur une plage simplifie l’itération sur une plage, mais ne prend en charge rien qui invalide la plage ou l’iterator utilisé. Bien sûr, même si cela était supporté, vous ne pourriez pas effacer efficacement un élément sans accéder à l’iterator.

Vous aurez besoin d’une boucle old-school, le long des lignes de

 for (auto it = container.begin(); it != container.end();) { if (something) { it = container.erase(it); } else { ++it; } } 

ou une combinaison de container.erase() et std::remove_if , si vous aimez ce genre de chose.

Vous avez besoin de l’iterator si vous souhaitez effacer un élément d’un conteneur.
Et vous ne pouvez pas obtenir l’iterator à partir de l’élément – et même si vous pouviez, par exemple, avec un vector , l’iterator qui utilise des plages en interne serait invalidé à l’étape suivante, ce qui provoquerait un comportement indéfini.

Donc, la réponse est: non, dans son utilisation classique, vous ne pouvez pas. basé sur la plage pour était uniquement conçu pour une itération commode de tous les éléments d’une plage.

poussez tous les éléments dans le tableau puis faites une pop pour enlever l’élément