sto offrendo diversi metodi:
1. Un metodo veloce che non trattiene l'ordine originale degli elementi:
assegnare l'ultimo elemento corrente del vettore per l'elemento da cancellare, quindi cancellare l'ultimo elemento. Questo eviterà grandi mosse e tutti gli indici tranne l'ultimo rimarranno costanti. Se inizi a cancellare dal retro, tutti gli indici precompilati saranno corretti.
void quickDelete(int idx)
{
vec[idx] = vec.back();
vec.pop_back();
}
vedo questo è essenzialmente una versione hand-coded dell'idioma erase-remove sottolineato da Klaim ...
2. Un metodo più lento che mantiene l'ordine originale degli elementi:
Passaggio 1: Contrassegna tutti gli elementi vettoriali da eliminare, ovvero con un valore speciale. Questo ha O (| indexes per eliminare |).
Fase 2: Cancella tutti gli elementi contrassegnati con v.erase(remove (v.begin(), v.end(), special_value), v.end());
. Questo ha O (| vector v |).
Il tempo di funzionamento totale è quindi O (| vettore v |), assumendo la lista degli indici è più corto del vettore.
3. Un altro metodo più lento che mantiene l'ordine originale degli elementi:
Usare un predicato e rimuovere se come descritto in https://stackoverflow.com/a/3487742/280314. Per rendere questo efficiente e rispettando il requisito di non "ordinamento, quindi cancellando linearmente con un offset", la mia idea è di implementare il predicato usando una tabella hash e regolare gli indici memorizzati nella tabella hash mentre la cancellazione procede al ritorno true, come Suggerì Klaim.
fonte
2010-08-15 14:17:32
"l'ordinamento che si cancella linearmente con un offset non è un'opzione": perché? – Niki