Ci sono due motivi per cui questa non è probabilmente una buona idea.
In primo luogo, la maggior parte degli algoritmi di libreria standard non deve utilizzare predicati per modificare gli elementi su cui agiscono.
Secondo, std::remove
e std::remove_if
non forniscono un buon set di elementi "rimossi" *. Puoi fare affidamento solo sugli elementi che sono selezionati per mantenere. Gli elementi "rimossi" potrebbero di fatto essere copie di quelli "buoni". E poiché stai memorizzando i puntatori condivisi, potrebbero puntare agli stessi oggetti degli elementi "buoni".
Un'alternativa sarebbe utilizzare std::partition
, quindi scorrere la sezione pertinente della partizione, quindi utilizzare erase
in un modo simile all'idioma di cancellazione-rimozione.
auto p = std::partition(v.begin, v.end(), pred);
std::for_each(p, v.end(), call_method_functor);
v.erase(p, v.end());
* Questi algoritmi dovrebbe probabilmente sono stati chiamati keep
e keep_if
Sarebbe meglio per riassumere le alternative, altrimenti si sta andando ad ottenere loro le risposte. – djechlin
Ecco come lo farei ma, cosa posso dire, sono pigro. Non c'è alternativa che ti permetta comunque di usare la libreria 'algorithm', giusto? Quindi, in entrambi i casi, stai violando la nozione di standard di programmazione "perfetti". (Modifica: a quanto pare c'è ma sarei ancora tentato di farlo a modo tuo!) – Elliott
Questo è il modo più efficiente che riesco a pensare. – 101010