STL suppression d'un element suivant critere

Le
Thierry
Bonjour,

je veux supprimer un element d'un vecteur suivant un critere.

Le code type serait
for (it = vec.begin(); it != vec.end(); it++)
if (it.value == 1)
it = vec.erase(it);

mais dans ce cas erase fait passer it a l'elem suivant et est reincrementé
dans la boucle, donc on saute un element.

Sur le net y'a des solutions comme ça:

for (it = vec.begin(); it != vec.end();) {

if (it.value == 1) {
it = vec.erase(it);
}
else it++;
}

Mais ca match pas avec mon code qui a différences branches et je dois
utiliser un flag pour savoir si je doit incrementer l'iterateur ou pas.

Pas tres élégant.

Y'a pas de façon de faire plus propre ??


--
Vainqueur du 1er WSOFRJCP
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Alain Migeon
Le #23357511
On Fri, 13 May 2011 11:55:49 +0200, Thierry
for (it = vec.begin(); it != vec.end(); it++)
if (it.value == 1)
it = vec.erase(it);



Bonjour,

Tu peux peut-être essayer ça.

Alain


for (it = vec.begin(); it != vec.end(); it++)
if (it.value == 1)
{
it = vec.erase(it);
it --;
}


--
________________________________________
Alain Migeon
Please reverse alain and migeon for replying.
Marc Boyer
Le #23357561
Le 13-05-2011, Thierry
Bonjour,

je veux supprimer un element d'un vecteur suivant un critere.

Le code type serait
for (it = vec.begin(); it != vec.end(); it++)
if (it.value == 1)
it = vec.erase(it);



Et tu ne peux pas utiliser le vec.erase() dans ton cas ?

Marc Boyer
--
En prenant aux 10% des francais les plus riches 12% de leurs revenus,
on pourrait doubler les revenus des 10% les plus pauvres.
http://www.inegalites.fr/spip.php?article1&id_mot0
Thierry
Le #23357631
"Alain Migeon" news::

On Fri, 13 May 2011 11:55:49 +0200, Thierry
for (it = vec.begin(); it != vec.end(); it++)
if (it.value == 1)
it = vec.erase(it);



Bonjour,

Tu peux peut-être essayer ça.

Alain


for (it = vec.begin(); it != vec.end(); it++)
if (it.value == 1)
{
it = vec.erase(it);
it --;
}



Ca ne marchera pas si on supprime le premier element parce que it-- va
foirer et même si on test != vec.begin on rate le nouvau premier element en
réincrementant.

--
Vainqueur du 1er WSOFRJCP
Jean-Marc Bourguet
Le #23357731
Thierry
Bonjour,

je veux supprimer un element d'un vecteur suivant un critere.



bool a_effacer(int i)
{
return i == 42;
}

vec.erase(std::remove(vec.begin(), vec.end(), 42));

vec.erase(std::remove_if(vec.begin(), vec.end(), a_effacer));

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
Jean-Marc Bourguet
Le #23357721
Poste sans reflechir, c'est pas bon...

Jean-Marc Bourguet
Thierry
Bonjour,

je veux supprimer un element d'un vecteur suivant un critere.



bool a_effacer(int i)
{
return i == 42;
}

vec.erase(std::remove(vec.begin(), vec.end(), 42));


vec.erase(std::remove(vec.begin(), vec.end(), 42), vec.end());

vec.erase(std::remove_if(vec.begin(), vec.end(), a_effacer));


vec.erase(std::remove_if(vec.begin(), vec.end(), a_effacer), vec.end());

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
Arnaud Giersch
Le #23357711
Vendredi 13 mai 2011, vers 11:55:49 (+0200), Thierry a écrit:

je veux supprimer un element d'un vecteur suivant un critere.

Le code type serait
for (it = vec.begin(); it != vec.end(); it++)
if (it.value == 1)
it = vec.erase(it);



Comme ça peut-être ?

it = std::remove(vec.begin(), vec.end(), 1);
vec.erase(it, vec.end());

Arnaud
Thierry
Le #23357831
Jean-Marc Bourguet news::

Thierry
Bonjour,

je veux supprimer un element d'un vecteur suivant un critere.



bool a_effacer(int i)
{
return i == 42;
}

vec.erase(std::remove(vec.begin(), vec.end(), 42));

vec.erase(std::remove_if(vec.begin(), vec.end(), a_effacer));



En fait c'est un peu plus complique et je dois supprimer des "doublons" si
ils ont les 2 premiers champs identiques mais que le 3 eme est inférieur a
l'autre.

J'ai bien vu:
http://learningcppisfun.blogspot.com/2008/04/remove-duplicates-from-
vector.html
mais std::unique doit se baser sur l'operateur == pour supprimer les
elements, et ça correspond pas a ce que je veux, puisque je veux garder les
elements strictement identiques.

De là je pense pas pouvoir faire autrement que d'utiliser 2 itérateurs.

--
Vainqueur du 1er WSOFRJCP
Marc
Le #23357931
Thierry wrote:

J'ai bien vu:
http://learningcppisfun.blogspot.com/2008/04/remove-duplicates-from-
vector.html
mais std::unique doit se baser sur l'operateur == pour supprimer les
elements, et ça correspond pas a ce que je veux, puisque je veux garder les
elements strictement identiques.



unique, comme tous les algos de la STL, peut prendre un foncteur comme
argument supplémentaire, au lieu d'utiliser ==.
Thierry
Le #23358031
Marc news:iqjbfa$2e9$:

Thierry wrote:

J'ai bien vu:
http://learningcppisfun.blogspot.com/2008/04/remove-duplicates-from-
vector.html
mais std::unique doit se baser sur l'operateur == pour supprimer les
elements, et ça correspond pas a ce que je veux, puisque je veux
garder les elements strictement identiques.



unique, comme tous les algos de la STL, peut prendre un foncteur comme
argument supplémentaire, au lieu d'utiliser ==.



Ok, la callback "foncteur" a deux arguments item1 et item2.
Quand je retourne true il supprimera item1 ou item2 ??
Je ne trouve pas dans la doc.

--
Vainqueur du 1er WSOFRJCP
Jean-Marc Bourguet
Le #23358111
Thierry
Jean-Marc Bourguet news::

Thierry
Bonjour,

je veux supprimer un element d'un vecteur suivant un critere.



bool a_effacer(int i)
{
return i == 42;
}

vec.erase(std::remove(vec.begin(), vec.end(), 42));

vec.erase(std::remove_if(vec.begin(), vec.end(), a_effacer));



En fait c'est un peu plus complique et je dois supprimer des "doublons" s i
ils ont les 2 premiers champs identiques mais que le 3 eme est infér ieur a
l'autre.



Comme ceci? (Avec 2 champs plutot que 3, mais l'idee y est)

class AEffacer
{
public:
AEffacer(int i, int j) : first(i), second(j) {}
bool operator()(std::pair<int, int> const& p) {
return p.first == first && p.second < second;
}
private:
int first, second;
};

vec.erase(std::remove_if(vec.begin(), vec.end(), AEffacer(4, 2)), vec.end() );

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
Publicité
Poster une réponse
Anonyme