Mam więc wektorem tak:Najlepszy sposób na usunięcie std :: unique_ptr z wektora z surowym wskaźnikiem?
std::vector<std::unique_ptr<SomeClass>> myVector;
Wtedy mam inny wektor, który zawiera surowe wskazówki dotyczące SomeClass
:
std::vector<SomeClass*> myOtherVector;
Jeśli istnieje element wewnątrz myOtherVector
będzie również wewnątrz myVector
, więc chcę przejść przez każdy element w myOtherVector
i usunąć ten sam element z myVector
. Następnie usuń wektor. To właśnie wymyśliłem:
for(size_t i = 0; i < myOtherVector.size(); i++)
{
myVector.erase(std::remove(myVector.begin(), myVector.end(), myOtherVector[i]), myVector.end());
}
myOtherVector.clear();
ten sposób powstaje błąd czasu kompilacji ponieważ myVector
posiada unikalne wskaźniki ale jestem dając funkcja remove()
surowego wskaźnik. W tym miejscu potrzebuję pomocy, ponieważ nie wiem, jaki byłby właściwy sposób rozwiązania tego problemu. Zmieniłem wiersz:
myVector.erase(std::remove(myVector.begin(), myVector.end(), std::unique_ptr<SomeClass>(myOtherVector[i])), myVector.end());
Frist to wszystko jest błędne, bo teraz mam dwie std::unique_ptr
s odwołujące się do tego samego obiektu. Element wewnątrz myVector
zawiera odniesienie, a konstrukcja unikalnego wskaźnika w powyższym wierszu jest kolejnym odniesieniem. I nie wiem nawet, czy skonstruowanie nowego wskaźnika, aby uzyskać ten sam typ, jest koncepcyjnie właściwym sposobem na zrobienie tego. Więc zmieniłem unikalne wskaźniki do wspólnych wskaźników „ApplicationName.exe spowodowała przerwania”
std::vector<std::shared_ptr<SomeClass>> myVector;
std::vector<SomeClass*> myOtherVector;
for(size_t i = 0; i < myOtherVector.size(); i++)
{
myVector.erase(std::remove(myVector.begin(), myVector.end(), std::shared_ptr<SomeClass>(myOtherVector[i])), myVector.end());
}
myOtherVector.clear();
Kiedy wpadłem aplikację linia myVector.erase()
skutkowało błędem wykonawczym który powiedział po kliknięciu Kontynuuj otrzymałem błąd asercji debugowania.
Więc oczywiście robię coś nie tak, ale nie wiem co. Jaki jest poprawny sposób na usunięcie inteligentnego wskaźnika z wektora z surowym wskaźnikiem?
Czy za uproszczenie problemu przez WHO nie tylko utrzymanie wektor surowych wskaźników zacząć? –
'std :: unique_ptr' ma element' get', który zwraca używany wskaźnik. –
Uh, propozycja. Jest jeszcze jeden inteligentny wskaźnik C++ 11 o nazwie 'std :: shared_ptr'. –