Dato un std::vector<std::unique_ptr<SomeType> >
, è legale utilizzare remove_if
su di esso? In altre parole, dato questo codice:Puoi usare `std :: remove_if` su un contenitore di` std :: unique_ptr`?
std::vector<std::unique_ptr<SomeType> > v;
// fill v, all entries point to a valid instance of SomeType...
v.erase(std::remove_if(v.begin(), v.end(), someCondition), v.end());
, sto garantita dopo la cancellazione che tutti i puntatori ancora in v
sono validi. So che data l'implementazione intuitiva di std::remove_if
, e date tutte le implementazioni che ho visto, saranno . Mi piacerebbe sapere se c'è qualcosa nello standard che lo garantisce; ovvero che std::remove_if
non è autorizzato a copiare una qualsiasi delle voci valide senza ricopiare la copia nella sua posizione finale .
(io sono, ovviamente, supponendo che la condizione non copia Se la condizione ha una firma come:.
struct Condition
{
bool operator()(std::unique_ptr<SomeType> ptr) const;
};
, poi, naturalmente, tutti i puntatori saranno validi dopo remove_if
.)
James Kanze fa domande - un fenomeno molto raro! – Nawaz
'unique_ptr' non è copiabile, quindi se hai usato quel predicato il tuo codice non verrebbe compilato. – interjay
Perché no? 'std :: unique' non è copiabile ma mobile. Può essere spostato alla fine del contenitore. –