2016-01-25 20 views
5

Il modo "normale" di eliminazione di un elemento da un vettore va in questo modo:std :: vector :: cancellare vs "swap e pop"

vec.erase(vec.begin() + index); 

ma in teoria è più veloce solo per fare questo:

if (vec.size() >= 2) 
{ 
    std::swap(vec.begin() + index, vec.end() - 1); 
    vec.pop_back(); 
} 
else 
{ 
    vec.clear(); 
} 

C'è qualche motivo per non usare quest'ultimo?

+2

È necessario il modo normale se è necessario conservare l'ordine. – zch

+1

Se è necessario che la cancellazione sia veloce, è sempre possibile considerare l'utilizzo di un elenco collegato. – CompuChip

+3

@CompuChip Finirà più lentamente del secondo esempio, tuttavia, e gli elenchi collegati sono fondamentalmente lenti per impostazione predefinita. – Veedrac

risposta

10

Il secondo caso non conserva l'ordine degli elementi nel vettore. Se questo è un vettore ordinato o l'ordine è importante, l'hai appena rotto nel secondo caso in cui il primo caso lascerebbe intatto l'ordine.

+1

E se l'ordine non è importante, un vettore probabilmente non è lo strumento giusto per qualsiasi lavoro. Anche se ci sono alcuni casi in cui l'ordine è così importante che un vettore è lo strumento giusto per il lavoro: D –