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

STL suppression d'un element suivant critere

21 réponses
Avatar
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

10 réponses

1 2 3
Avatar
Alain Migeon
On Fri, 13 May 2011 11:55:49 +0200, Thierry wrote:

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.
Avatar
Marc Boyer
Le 13-05-2011, Thierry a écrit :
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
Avatar
Thierry
"Alain Migeon" écrivait
news::

On Fri, 13 May 2011 11:55:49 +0200, Thierry wrote:

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
Avatar
Jean-Marc Bourguet
Thierry writes:

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

Jean-Marc Bourguet writes:

Thierry writes:

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
Avatar
Arnaud Giersch
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
Avatar
Thierry
Jean-Marc Bourguet écrivait
news::

Thierry writes:

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
Avatar
Marc
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 ==.
Avatar
Thierry
Marc écrivait
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
Avatar
Jean-Marc Bourguet
Thierry writes:

Jean-Marc Bourguet écrivait
news::

Thierry writes:

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
1 2 3