Esistono due modi in cui è possibile utilizzare per cancellare un elemento in particolare. prendiamo un vettore
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) Modo non efficiente: anche se sembra essere abbastanza efficiente ma non è perché la funzione di cancellazione cancella gli elementi e sposta tutti gli elementi verso sinistra di 1.
quindi la sua complessità sarà 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) Modo efficiente (CONSIGLIATO) : è anche noto come ERASE - REMOVE idioms .
- std :: remove trasforma l'intervallo dato in un intervallo con tutti gli elementi che si confrontano non uguali a un dato elemento spostato all'inizio del contenitore.
- Quindi, in realtà non rimuovere gli elementi corrispondenti. Ha appena spostato il non abbinato all'inizio e dà un iteratore alla nuova fine valida. Richiede solo O (n) complessità.
l'output dell'algoritmo remove è:
10 20 30 50 40 50
come tipo di ritorno di rimozione è iteratore alla nuova fine di quell'intervallo.
template <class ForwardIterator, class T>
ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);
Ora usa la funzione di cancellazione del vettore per eliminare elementi dalla nuova estremità alla vecchia estremità del vettore. Richiede O (1) tempo.
v.erase ( std :: remove (v.begin() , v.end() , element ) , v.end () );
quindi questo metodo funziona in O (n)