Vous pouvez utiliser deux méthodes pour effacer un élément en particulier. prenons un vecteur
std :: vector < int > v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(40);
v.push_back(50);
1) Manière non efficace: bien que cela semble assez efficace mais ce n'est pas parce que la fonction d'effacement supprime les éléments et décale tous les éléments vers la gauche de 1.
donc sa complexité sera O (n ^ 2)
std :: vector < int > :: iterator itr = v.begin();
int value = 40;
while ( itr != v.end() )
{
if(*itr == value)
{
v.erase(itr);
}
else
++itr;
}
2) Moyen efficace (RECOMMANDÉ) : Il est également connu sous le nom de ERASE - REMOVE idioms .
- std :: remove transforme la plage donnée en une plage avec tous les éléments qui se comparent non égaux à l'élément donné décalés au début du conteneur.
- Donc, ne supprimez pas les éléments correspondants. Il a simplement déplacé le non apparié au début et donne un itérateur à une nouvelle fin valide. Cela nécessite juste une complexité O (n).
la sortie de l'algorithme de suppression est:
10 20 30 50 40 50
comme type de retour de remove est un itérateur vers la nouvelle extrémité de cette plage.
template <class ForwardIterator, class T>
ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);
Utilisez maintenant la fonction d'effacement du vecteur pour supprimer des éléments de la nouvelle extrémité à l'ancienne extrémité du vecteur. Il faut un temps O (1).
v.erase ( std :: remove (v.begin() , v.end() , element ) , v.end () );
donc cette méthode fonctionne en O (n)