Es gibt zwei Möglichkeiten, mit denen Sie ein Element besonders löschen können. Nehmen wir einen Vektor
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) Nicht effizienter Weg: Obwohl es ziemlich effizient zu sein scheint, liegt es nicht daran, dass die Löschfunktion die Elemente löscht und alle Elemente um 1 nach links verschiebt,
sodass ihre Komplexität O (n ^ 2) ist.
std :: vector < int > :: iterator itr = v.begin();
int value = 40;
while ( itr != v.end() )
{
if(*itr == value)
{
v.erase(itr);
}
else
++itr;
}
2) Effizienter Weg (EMPFOHLEN) : Es wird auch als ERASE - REMOVE-Redewendungen bezeichnet .
- std :: remove transformiert den angegebenen Bereich in einen Bereich, in dem alle Elemente, die nicht mit dem angegebenen Element verglichen werden, an den Anfang des Containers verschoben werden.
- Entfernen Sie also nicht die übereinstimmenden Elemente. Es hat nur das nicht übereinstimmende zum Start verschoben und gibt einen Iterator zum neuen gültigen Ende. Es erfordert nur O (n) Komplexität.
Die Ausgabe des Entfernungsalgorithmus lautet:
10 20 30 50 40 50
Als Rückgabetyp entfernt wird der Iterator zum neuen Ende dieses Bereichs.
template <class ForwardIterator, class T>
ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);
Verwenden Sie nun die Löschfunktion des Vektors, um Elemente vom neuen zum alten Ende des Vektors zu löschen. Es benötigt O (1) Zeit.
v.erase ( std :: remove (v.begin() , v.end() , element ) , v.end () );
Diese Methode funktioniert also in O (n).