2015-05-05 18 views
7

Mam dwa zestawy i iterator do elementu a:Move `unique_ptr`s między zestawami

set<unique_ptr<X>> a, b; 
set<unique_ptr<X>>::iterator iter = find something in a; 

Chciałbym usunąć element wskazywany przez iter z a i włóż ją do b. Czy to możliwe? W jaki sposób?

+0

@black: Wierzę, że pytanie jest samoistne. Jeśli jesteś na tyle mądry, aby odpowiedzieć, problemy powinny być dla ciebie oczywiste. – ybungalobill

+0

Moim zdaniem jednak kwestia ta powinna być widoczna w pytaniu i nie powinna wymagać od użytkownika kodu, aby się pojawił. Problem, który widzę może się różnić od tego, co widzisz. Mam problemy z 'const', a co z tobą? – edmz

+1

@black: Nie musisz niczego koduwać. W rzeczywistości nawet nie próbowałem skompilować żadnego kodu, ponieważ znam wystarczająco dobrze język, aby wiedzieć, że wstawianie i usuwanie nie będzie działać. Pytanie jest skierowane do tych, którzy znają standard C++ wystarczająco dobrze i mogą wskazać mi konkretną część interfejsu std :: set lub kombinację tych, które spełnią to, czego potrzebuję. Pytanie jest tam i jeśli uważasz, że każdy problem z SO przekłada się na błąd kompilatora, jest dla ciebie za zły. – ybungalobill

Odpowiedz

2

Cóż, podejrzewam, że nie ma normalnego sposobu na zrobienie tego. Ale zawsze jest nienormalna jeden :) można wykonać następujące czynności:

auto tmp = const_cast<std::unique_ptr<std::string>&&>(*iter); 
a.erase(iter); 
b.insert(std::move(tmp)); 

Ok, pierwszy wiersz naruszone set niezmienne i to jest straszne, ale o ile mi zrozumieć, że nie powinno być problemu ponieważ na następnej linii usuwamy ten zły węzeł z zestawu.

+0

Czy nie spowoduje to unieważnienia unique_ptr przy usunięciu? –

+0

@TasosVogiatzoglou, nie, nie będzie. Przesuneliśmy obiekt z zestawu 'a' na' tmp', a po usunięciu set 'a' zawiera obiekt' moved-from'' unique_ptr'. – ixSci

+0

Oh, ok. Kiedy to czytałem, pomyślałem, że po usunięciu nazywa się deleterem. –

Powiązane problemy