quand je parcours un vecteur à l'aide d'une boucle for, et qu'un élément
de ce vecteur doit être supprimé, est-ce que faire un erase() de
l'itérateur correspondant va affecter la suite de ma boucle? Ex:
for (std::vector<int>::const_iterator ite = vect.begin(); ite !=
vect.end(); ++ite)
if (*ite == 8)
vect.erase(*ite);
Après le erase(*ite), est-ce que c'est bien l'élément "après" qui va être
analysé?
ca dépend de l'implementation et du type d'objet pointé par l'iterateur.
il faut voir si dans l'implementation du vector<> (dans le man) le fait d'effacer un element invalide l'iterateur.
en général, oui. en gros: v.erase(*iter); *iter = 10; ca plante !
pour eviter ce genre de question, il faut préparer une iteration +1 :
ci = v.begin(); cn = ci++; if (*ci == val) v.erase(*ci); ci = cn; else ci = cn; cn++; ...
et la c'est clair ? ;-)
Franck Branjonneau
"Michaël Delva" écrivait:
Bonjour à tous,
Bonjour,
quand je parcours un vecteur à l'aide d'une boucle for, et qu'un élément de ce vecteur doit être supprimé, est-ce que faire un erase() de l'itérateur correspondant va affecter la suite de ma boucle?
Sans aucun doute. vector<>::erase(it) détruis l'élément désigné par it et retourne un itérateur sur l'élément qui suivait it avant sa destruction.
quand je parcours un vecteur à l'aide d'une boucle for, et qu'un
élément de ce vecteur doit être supprimé, est-ce que faire un
erase() de l'itérateur correspondant va affecter la suite de ma
boucle?
Sans aucun doute. vector<>::erase(it) détruis l'élément désigné par it
et retourne un itérateur sur l'élément qui suivait it avant sa
destruction.
quand je parcours un vecteur à l'aide d'une boucle for, et qu'un élément de ce vecteur doit être supprimé, est-ce que faire un erase() de l'itérateur correspondant va affecter la suite de ma boucle?
Sans aucun doute. vector<>::erase(it) détruis l'élément désigné par it et retourne un itérateur sur l'élément qui suivait it avant sa destruction.
J'espère m'être bien fait comprendre...
Très bien. -- Franck Branjonneau
Fabien LE LEZ
On Mon, 23 Feb 2004 12:14:07 +0100, Nicolas wrote:
il faut voir si dans l'implementation du vector<> (dans le man) le fait d'effacer un element invalide l'iterateur.
Je confirme que c'est oui : une modification du nombre d'éléments d'un std::vector<> invalide[*] tous les itérateurs sur des éléments de ce vector<>. Ta solution ne fonctionne donc pas non plus.
[*] Plus précisément, on n'est pas sûr qu'ils sont invalidés, mais comme la possibilité existe, on ne peut pas prendre le risque.
-- ;-)
On Mon, 23 Feb 2004 12:14:07 +0100, Nicolas <nicolas.belan@tele2.fr>
wrote:
il faut voir si dans l'implementation du vector<> (dans le man) le fait
d'effacer un element invalide l'iterateur.
Je confirme que c'est oui : une modification du nombre d'éléments d'un
std::vector<> invalide[*] tous les itérateurs sur des éléments de ce
vector<>. Ta solution ne fonctionne donc pas non plus.
[*] Plus précisément, on n'est pas sûr qu'ils sont invalidés, mais
comme la possibilité existe, on ne peut pas prendre le risque.
On Mon, 23 Feb 2004 12:14:07 +0100, Nicolas wrote:
il faut voir si dans l'implementation du vector<> (dans le man) le fait d'effacer un element invalide l'iterateur.
Je confirme que c'est oui : une modification du nombre d'éléments d'un std::vector<> invalide[*] tous les itérateurs sur des éléments de ce vector<>. Ta solution ne fonctionne donc pas non plus.
[*] Plus précisément, on n'est pas sûr qu'ils sont invalidés, mais comme la possibilité existe, on ne peut pas prendre le risque.
-- ;-)
Guillaume Brocker
Franck Branjonneau wrote:
Sans aucun doute. vector<>::erase(it) détruis l'élément désigné par it et retourne un itérateur sur l'élément qui suivait it avant sa destruction.
Pour revenir à l'exemple de départ, on peut le transfomer comme suit:
Et pourquoi ne pas utiliser un while plutot que la structure etrange
for(;;) { if (cond) { ... } else { break; }
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Et pourquoi ne pas utiliser un while plutot que la structure etrange
for(;;) {
if (cond) {
...
} else {
break;
}
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Et pourquoi ne pas utiliser un while plutot que la structure etrange
for(;;) { if (cond) { ... } else { break; }
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Manuel
"Michaël Delva" a écrit dans le message de news:
Bonjour à tous,
quand je parcours un vecteur à l'aide d'une boucle for, et qu'un élément de ce vecteur doit être supprimé, est-ce que faire un erase() de l'itérateur correspondant va affecter la suite de ma boucle? Ex:
for (std::vector<int>::const_iterator ite = vect.begin(); ite ! > vect.end(); ++ite) if (*ite == 8) vect.erase(*ite);
Après le erase(*ite), est-ce que c'est bien l'élément "après" qui va être analysé?
J'espère m'être bien fait comprendre...
Merci d'avance
Ca ne marchera pas comme ça. L'itérateur n'est plus valide après vect.erase().
AMHA, ce serait mieux d'écrire :
std::vector<int>::const_iterator ite = vect.begin(); while (ite != vect.end()) if (*ite == 8) vect.erase(*ite++);
Mais je n'en suis pas certain. Une meilleure solution serait d'utiliser std::remove_if :
inline bool egale_huit(int n) { return (8 == n); } // ou avec un template, un objet fonction, ... c'est selon le besoin. vect.erase(std::remove_if(vect.begin(), vect.end(), egale_huit), vect.end());
En espérant que ça aidera. :-)
--
- Manuel to reply, swap the name with the domain.
"Michaël Delva" <zoubidaman@hotmail.com> a écrit dans le message de
news:Xns94987A185378Ezoubidamanhotmailcom@212.27.42.69...
Bonjour à tous,
quand je parcours un vecteur à l'aide d'une boucle for, et qu'un élément
de ce vecteur doit être supprimé, est-ce que faire un erase() de
l'itérateur correspondant va affecter la suite de ma boucle? Ex:
for (std::vector<int>::const_iterator ite = vect.begin(); ite ! > vect.end(); ++ite)
if (*ite == 8)
vect.erase(*ite);
Après le erase(*ite), est-ce que c'est bien l'élément "après" qui va être
analysé?
J'espère m'être bien fait comprendre...
Merci d'avance
Ca ne marchera pas comme ça.
L'itérateur n'est plus valide après vect.erase().
AMHA, ce serait mieux d'écrire :
std::vector<int>::const_iterator ite = vect.begin();
while (ite != vect.end())
if (*ite == 8)
vect.erase(*ite++);
Mais je n'en suis pas certain.
Une meilleure solution serait d'utiliser std::remove_if :
inline bool egale_huit(int n) { return (8 == n); }
// ou avec un template, un objet fonction, ... c'est selon le besoin.
vect.erase(std::remove_if(vect.begin(), vect.end(), egale_huit),
vect.end());
quand je parcours un vecteur à l'aide d'une boucle for, et qu'un élément de ce vecteur doit être supprimé, est-ce que faire un erase() de l'itérateur correspondant va affecter la suite de ma boucle? Ex:
for (std::vector<int>::const_iterator ite = vect.begin(); ite ! > vect.end(); ++ite) if (*ite == 8) vect.erase(*ite);
Après le erase(*ite), est-ce que c'est bien l'élément "après" qui va être analysé?
J'espère m'être bien fait comprendre...
Merci d'avance
Ca ne marchera pas comme ça. L'itérateur n'est plus valide après vect.erase().
AMHA, ce serait mieux d'écrire :
std::vector<int>::const_iterator ite = vect.begin(); while (ite != vect.end()) if (*ite == 8) vect.erase(*ite++);
Mais je n'en suis pas certain. Une meilleure solution serait d'utiliser std::remove_if :
inline bool egale_huit(int n) { return (8 == n); } // ou avec un template, un objet fonction, ... c'est selon le besoin. vect.erase(std::remove_if(vect.begin(), vect.end(), egale_huit), vect.end());
En espérant que ça aidera. :-)
--
- Manuel to reply, swap the name with the domain.
Franck Branjonneau
Jean-Marc Bourguet écrivait:
Guillaume Brocker writes:
Franck Branjonneau wrote:
Sans aucun doute. vector<>::erase(it) détruis l'élément désigné par it et retourne un itérateur sur l'élément qui suivait it avant sa destruction.
Pour revenir à l'exemple de départ, on peut le transfomer comme suit:
[ une horrible boucle for ]
Et pourquoi ne pas utiliser un while plutot que la structure etrange
for(;;) { if (cond) { ... } else { break; }
Ou alors :
vect.erase(std::remove_if(vect.begin(), vect.end(), std::bind2nd(std::equal_to< int >(), 5)), vect.end()); -- Franck Branjonneau
Sans aucun doute. vector<>::erase(it) détruis l'élément désigné par it et retourne un itérateur sur l'élément qui suivait it avant sa destruction.
Pour revenir à l'exemple de départ, on peut le transfomer comme suit:
[ une horrible boucle for ]
Et pourquoi ne pas utiliser un while plutot que la structure etrange
for(;;) { if (cond) { ... } else { break; }
Ou alors :
vect.erase(std::remove_if(vect.begin(), vect.end(), std::bind2nd(std::equal_to< int >(), 5)), vect.end()); -- Franck Branjonneau
Alain Migeon
In article , says...
Bonjour à tous,
quand je parcours un vecteur à l'aide d'une boucle for, et qu'un él ément de ce vecteur doit être supprimé, est-ce que faire un erase() de l'itérateur correspondant va affecter la suite de ma boucle? Ex:
for (std::vector<int>::const_iterator ite = vect.begin(); ite != vect.end(); ++ite) if (*ite == 8) vect.erase(*ite);
Après le erase(*ite), est-ce que c'est bien l'élément "après" qui va être analysé?
J'espère m'être bien fait comprendre...
Merci d'avance
Une solution sûre consiste à mettre les itérateurs des éléments q ue tu veux supprimer dans un autre vecteur. Et ensuite de parcourir ce vecteur.
In article <Xns94987A185378Ezoubidamanhotmailcom@212.27.42.69>,
zoubidaman@hotmail.com says...
Bonjour à tous,
quand je parcours un vecteur à l'aide d'une boucle for, et qu'un él ément
de ce vecteur doit être supprimé, est-ce que faire un erase() de
l'itérateur correspondant va affecter la suite de ma boucle? Ex:
for (std::vector<int>::const_iterator ite = vect.begin(); ite !=
vect.end(); ++ite)
if (*ite == 8)
vect.erase(*ite);
Après le erase(*ite), est-ce que c'est bien l'élément "après" qui va être
analysé?
J'espère m'être bien fait comprendre...
Merci d'avance
Une solution sûre consiste à mettre les itérateurs des éléments q ue tu
veux supprimer dans un autre vecteur. Et ensuite de parcourir ce
vecteur.
quand je parcours un vecteur à l'aide d'une boucle for, et qu'un él ément de ce vecteur doit être supprimé, est-ce que faire un erase() de l'itérateur correspondant va affecter la suite de ma boucle? Ex:
for (std::vector<int>::const_iterator ite = vect.begin(); ite != vect.end(); ++ite) if (*ite == 8) vect.erase(*ite);
Après le erase(*ite), est-ce que c'est bien l'élément "après" qui va être analysé?
J'espère m'être bien fait comprendre...
Merci d'avance
Une solution sûre consiste à mettre les itérateurs des éléments q ue tu veux supprimer dans un autre vecteur. Et ensuite de parcourir ce vecteur.
quand je parcours un vecteur à l'aide d'une boucle for, et qu'un élément de ce vecteur doit être supprimé, est-ce que faire un erase() de l'itérateur correspondant va affecter la suite de ma boucle? Ex:
for (std::vector<int>::const_iterator ite = vect.begin(); ite ! > > vect.end(); ++ite) if (*ite == 8) vect.erase(*ite);
Après le erase(*ite), est-ce que c'est bien l'élément "après" qui va être analysé?
J'espère m'être bien fait comprendre...
Merci d'avance
Une solution sûre consiste à mettre les itérateurs des éléments que tu veux supprimer dans un autre vecteur. Et ensuite de parcourir ce vecteur.
Pas sur du tout tel qu'ecrit: les iterateurs d'un vecteur (pointant apres l'iterateur) sont invalides apres tout effacement. Si t'iteres a l'envers par contre, c'est correct.
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Alain Migeon <agm@dk.rovsing> writes:
In article <Xns94987A185378Ezoubidamanhotmailcom@212.27.42.69>,
zoubidaman@hotmail.com says...
Bonjour à tous,
quand je parcours un vecteur à l'aide d'une boucle for, et qu'un élément
de ce vecteur doit être supprimé, est-ce que faire un erase() de
l'itérateur correspondant va affecter la suite de ma boucle? Ex:
for (std::vector<int>::const_iterator ite = vect.begin(); ite ! > > vect.end(); ++ite)
if (*ite == 8)
vect.erase(*ite);
Après le erase(*ite), est-ce que c'est bien l'élément "après" qui va être
analysé?
J'espère m'être bien fait comprendre...
Merci d'avance
Une solution sûre consiste à mettre les itérateurs des éléments que tu
veux supprimer dans un autre vecteur. Et ensuite de parcourir ce
vecteur.
Pas sur du tout tel qu'ecrit: les iterateurs d'un vecteur (pointant
apres l'iterateur) sont invalides apres tout effacement. Si t'iteres
a l'envers par contre, c'est correct.
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
quand je parcours un vecteur à l'aide d'une boucle for, et qu'un élément de ce vecteur doit être supprimé, est-ce que faire un erase() de l'itérateur correspondant va affecter la suite de ma boucle? Ex:
for (std::vector<int>::const_iterator ite = vect.begin(); ite ! > > vect.end(); ++ite) if (*ite == 8) vect.erase(*ite);
Après le erase(*ite), est-ce que c'est bien l'élément "après" qui va être analysé?
J'espère m'être bien fait comprendre...
Merci d'avance
Une solution sûre consiste à mettre les itérateurs des éléments que tu veux supprimer dans un autre vecteur. Et ensuite de parcourir ce vecteur.
Pas sur du tout tel qu'ecrit: les iterateurs d'un vecteur (pointant apres l'iterateur) sont invalides apres tout effacement. Si t'iteres a l'envers par contre, c'est correct.
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Alain Migeon
In article , says...
Alain Migeon writes:
In article , says...
Bonjour à tous,
quand je parcours un vecteur à l'aide d'une boucle for, et qu'un élément de ce vecteur doit être supprimé, est-ce que faire un erase() de l'itérateur correspondant va affecter la suite de ma boucle? Ex:
for (std::vector<int>::const_iterator ite = vect.begin(); ite != vect.end(); ++ite) if (*ite == 8) vect.erase(*ite);
Après le erase(*ite), est-ce que c'est bien l'élément "après" qui va être analysé?
J'espère m'être bien fait comprendre...
Merci d'avance
Une solution sûre consiste à mettre les itérateurs des élémen ts que tu veux supprimer dans un autre vecteur. Et ensuite de parcourir ce vecteur.
Pas sur du tout tel qu'ecrit: les iterateurs d'un vecteur (pointant apres l'iterateur) sont invalides apres tout effacement. Si t'iteres a l'envers par contre, c'est correct.
Mea culpa.
J'ai écrit trop vite. C'est la méthode que j'utilise pour supprimer les éléments d'un map. Dans ce cas un itérateur reste valide jusqu'à sa suppression.
Alain
In article <pxbsmh14zew.fsf@news.bourguet.org>, jm@bourguet.org says...
Alain Migeon <agm@dk.rovsing> writes:
In article <Xns94987A185378Ezoubidamanhotmailcom@212.27.42.69>,
zoubidaman@hotmail.com says...
Bonjour à tous,
quand je parcours un vecteur à l'aide d'une boucle for, et qu'un élément
de ce vecteur doit être supprimé, est-ce que faire un erase() de
l'itérateur correspondant va affecter la suite de ma boucle? Ex:
for (std::vector<int>::const_iterator ite = vect.begin(); ite !=
vect.end(); ++ite)
if (*ite == 8)
vect.erase(*ite);
Après le erase(*ite), est-ce que c'est bien l'élément "après" qui va être
analysé?
J'espère m'être bien fait comprendre...
Merci d'avance
Une solution sûre consiste à mettre les itérateurs des élémen ts que tu
veux supprimer dans un autre vecteur. Et ensuite de parcourir ce
vecteur.
Pas sur du tout tel qu'ecrit: les iterateurs d'un vecteur (pointant
apres l'iterateur) sont invalides apres tout effacement. Si t'iteres
a l'envers par contre, c'est correct.
Mea culpa.
J'ai écrit trop vite.
C'est la méthode que j'utilise pour supprimer les éléments d'un map.
Dans ce cas un itérateur reste valide jusqu'à sa suppression.
quand je parcours un vecteur à l'aide d'une boucle for, et qu'un élément de ce vecteur doit être supprimé, est-ce que faire un erase() de l'itérateur correspondant va affecter la suite de ma boucle? Ex:
for (std::vector<int>::const_iterator ite = vect.begin(); ite != vect.end(); ++ite) if (*ite == 8) vect.erase(*ite);
Après le erase(*ite), est-ce que c'est bien l'élément "après" qui va être analysé?
J'espère m'être bien fait comprendre...
Merci d'avance
Une solution sûre consiste à mettre les itérateurs des élémen ts que tu veux supprimer dans un autre vecteur. Et ensuite de parcourir ce vecteur.
Pas sur du tout tel qu'ecrit: les iterateurs d'un vecteur (pointant apres l'iterateur) sont invalides apres tout effacement. Si t'iteres a l'envers par contre, c'est correct.
Mea culpa.
J'ai écrit trop vite. C'est la méthode que j'utilise pour supprimer les éléments d'un map. Dans ce cas un itérateur reste valide jusqu'à sa suppression.