Biorąc pod uwagę std::vector<std::unique_ptr<SomeType> >
, czy jest legalne używanie na nim remove_if
? Innymi słowy, biorąc pod uwagę ten kod:Czy możesz użyć `std :: remove_if` na kontenerze` 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());
, mam zagwarantowane po erase, że wszystkie wskaźniki są nadal w v
ważny. Wiem, że biorąc pod uwagę intuicyjną implementację std::remove_if
, i biorąc pod uwagę wszystkie implementacje, na które patrzyłem, będą one. Chciałbym wiedzieć, czy jest coś w standardzie , które to gwarantuje; to jest, że std::remove_if
nie może kopiować żadnego z prawidłowych wpisów bez kopiowania kopii do ostatecznej lokalizacji .
(Jestem, oczywiście, przy założeniu, że stan nie kopiuje Jeśli warunek ma sygnaturę podobnego.
struct Condition
{
bool operator()(std::unique_ptr<SomeType> ptr) const;
};
, to oczywiście, wszystkie wskaźniki będą nieważne po remove_if
.)
James Kanze zadaje pytania - bardzo rzadkie zjawisko! – Nawaz
'unique_ptr' nie jest konstrukcją kopiowalną, więc jeśli użyjesz tego predykatu, twój kod się nie skompiluje. – interjay
Dlaczego nie? 'std :: unique' nie jest kopiowalny, ale ruchomy. Można go przenieść na koniec pojemnika. –