OVH Cloud OVH Cloud

Vector

6 réponses
Avatar
Etienne Rousee
Bonjour,

Autre problème:

for (it = V.begin(); it != V.end(); it++)
if ( /* condition */ ) V.erase(it);

En faisant celà, je me marche sur la queue.
Y a-t-il une façon élégante, sans passer par un
autre vecteur temporaire, de supprimer tous
les éléments d'un conteneur vérifiant une
condition, avec un certain type d'itérateur,
ou en passant erase à un certain algorithme,
ou ...... ?

--

Etienne

6 réponses

Avatar
James Kanze
Etienne Rousee wrote:

Autre problème:


for (it = V.begin(); it != V.end(); it++)
if ( /* condition */ ) V.erase(it);


En faisant celà, je me marche sur la queue. Y a-t-il une
façon élégante, sans passer par un autre vecteur temporaire,
de supprimer tous les éléments d'un conteneur vérifiant une
condition, avec un certain type d'itérateur, ou en passant
erase à un certain algorithme, ou ...... ?


V.erase( std::remove( V.begin(), V.end(), /*condition*/ ),
V.end() ) ;

Sinon :

it = V.begin() ;
while ( it != V.end() ) {
if ( /* condition */ ) {
it = v.erase( it ) ;
} else {
++ it ;
}
}

Mais c'est vrai qu'avant la STL, j'avais toujours considéré ta
boucle comme un minimum de fonctionnalité qu'il fallait
supporter dans une implémentation professionnelle.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34

Avatar
Etienne Rousee
"James Kanze" a écrit ...
Etienne Rousee wrote:

Autre problème:

for (it = V.begin(); it != V.end(); it++)
if ( /* condition */ ) V.erase(it);

En faisant celà, je me marche sur la queue. Y a-t-il une
façon élégante, sans passer par un autre vecteur temporaire,
de supprimer tous les éléments d'un conteneur vérifiant une
condition, avec un certain type d'itérateur, ou en passant
erase à un certain algorithme, ou ...... ?


V.erase( std::remove( V.begin(), V.end(), /*condition*/ ),
V.end() ) ;


Oui, mais ma condition est de la forme "it->toto == -1"
et là, il n'y a plus l'itérateur.

Sinon :

it = V.begin() ;
while ( it != V.end() ) {
if ( /* condition */ ) {
it = v.erase( it ) ;
} else {
++ it ;
}
}


Merci, je vais essayer ça.

Mais c'est vrai qu'avant la STL, j'avais toujours considéré ta
boucle comme un minimum de fonctionnalité qu'il fallait
supporter dans une implémentation professionnelle.


Ben oui.

--

Etienne


Avatar
kanze
Etienne Rousee wrote:
"James Kanze" a écrit ...
Etienne Rousee wrote:

Autre problème:

for (it = V.begin(); it != V.end(); it++)
if ( /* condition */ ) V.erase(it);

En faisant celà, je me marche sur la queue. Y a-t-il une
façon élégante, sans passer par un autre vecteur
temporaire, de supprimer tous les éléments d'un conteneur
vérifiant une condition, avec un certain type
d'itérateur, ou en passant erase à un certain algorithme,
ou ...... ?


V.erase( std::remove( V.begin(), V.end(), /*condition*/ ),
V.end() ) ;


Oui, mais ma condition est de la forme "it->toto == -1" et là,
il n'y a plus l'itérateur.


Je ne comprends pas le problème. Pourquoi est-ce que quelque
chose du genre :

struct Condition
{
bool operator()( MaClasse const& obj ) const
{
return obj.toto == -1 ;
}
} ;

ne ferait pas l'affaire ?

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34



Avatar
Etienne Rousee
"kanze" a écrit ...
V.erase( std::remove( V.begin(), V.end(), /*condition*/ ),
V.end() ) ;


Oui, mais ma condition est de la forme "it->toto == -1" et là,
il n'y a plus l'itérateur.


Je ne comprends pas le problème. Pourquoi est-ce que quelque
chose du genre :

struct Condition
{
bool operator()( MaClasse const& obj ) const
{
return obj.toto == -1 ;
}
} ;

ne ferait pas l'affaire ?


Bon, je comprends cette structure, mais la syntaxe de son
introduction dans remove m'échappe.

--

Etienne



Avatar
Etienne Rousee
"kanze" a écrit ...

J'ai trouvé, il suffit d'utiliser remove_if:

V.erase( remove_if( V.begin(), V.end(), Elimine ),V.end() ) ;

avec:

bool Elimine(MaClasse &obj)
{
return obj.toto == -1;
}

Ou une instance de ta structure Condition.

Merci.

--

Etienne
Avatar
loufoque

Bon, je comprends cette structure, mais la syntaxe de son
introduction dans remove m'échappe.



Je crois qu'il s'agit de
std::remove(V.begin(), V.end(), Condition())