2013-02-28 11 views
5

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?

+0

Czy za uproszczenie problemu przez WHO nie tylko utrzymanie wektor surowych wskaźników zacząć? –

+0

'std :: unique_ptr' ma element' get', który zwraca używany wskaźnik. –

+1

Uh, propozycja. Jest jeszcze jeden inteligentny wskaźnik C++ 11 o nazwie 'std :: shared_ptr'. –

Odpowiedz

1

To w jaki sposób to zrobić. Wydajność można poprawić, ale dopóki nie okaże się, że jest to wąskie gardło dla twojej aplikacji, nie zawracałbym sobie tym głowy. Algorytm jest prosty i przejrzysty.

Używa ona remove_if do selektywnego usuwania z pierwszego kontenera (myVector) wszystkich elementów wskazujących na obiekty wskazane przez elementy drugiego kontenera (myOtherVector); następnie usuwa drugi pojemnik. Orzecznikiem jest realizowana za pośrednictwem funkcji lambda:

#include <vector> 
#include <memory> 
#include <algorithm> 

struct SomeClass { /* ... */ }; 

int main() 
{ 
    std::vector<std::unique_ptr<SomeClass>> myVector; 
    std::vector<SomeClass*> myOtherVector; 

    myVector.erase(
     std::remove_if(// Selectively remove elements in the second vector... 
      myVector.begin(), 
      myVector.end(), 
      [&] (std::unique_ptr<SomeClass> const& p) 
      { // This predicate checks whether the element is contained 
       // in the second vector of pointers to be removed... 
       return std::find(
        myOtherVector.cbegin(), 
        myOtherVector.cend(), 
        p.get() 
        ) != myOtherVector.end(); 
      }), 
     myVector.end() 
     ); 

    myOtherVector.clear(); 
} 
3

std::unique_ptr ma funkcję członka, get, która zwraca używany wskaźnik.

Rozważmy następujący:

std::sort(myOtherVector.begin(), myOtherVector.end()); 

myVector.erase(std::remove_if(myVector.begin(), myVector.end(), 
[&](std::unique_ptr<SomeClass> const& p) -> bool 
{ 
    return std::binary_search(myOtherVector.begin(), myOtherVector.end(), 
           p.get()); 
})); 

myOtherVector.clear();  
Powiązane problemy