2015-05-05 5 views
7

ho due set e un iteratore ad un elemento di a:Sposta `unique_ptr`s tra le serie

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

Vorrei rimuovere l'elemento puntato da iter da a e inserirla in b. È possibile? Come?

+0

@black: Credo che la domanda sia autonoma. Se sei abbastanza intelligente da rispondere, i problemi dovrebbero essere evidenti per te. – ybungalobill

+0

A mio avviso, tuttavia, il problema dovrebbe essere evidente nella domanda e non dovrebbe richiedere di codificare qualcosa da mostrare. Il problema che vedo potrebbe essere diverso da quello che vedi. Ottengo problemi con 'const'ness, e tu? – edmz

+1

@black: non è necessario codificare nulla. In effetti non ho nemmeno provato a compilare alcun codice perché conosco abbastanza bene la lingua per sapere che l'inserimento e la cancellazione non funzioneranno. La domanda è rivolta a coloro che conoscono lo standard C++ abbastanza bene e possono indicarmi una particolare parte dell'interfaccia std :: set, o una sua combinazione, che realizzerebbe ciò di cui ho bisogno. La domanda è lì, e se pensi che ogni problema su SO si traduca in un errore del compilatore, troppo male per te. – ybungalobill

risposta

2

Bene, ho il sospetto che non ci sia un modo normale per farlo. Ma c'è sempre un non-normale uno :) È possibile effettuare le seguenti operazioni:

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

Ok, la prima linea di violato set invariante ed è orribile, ma per quanto mi risulta, non dovrebbe essere un problema poiché nella riga successiva rimuoviamo questo nodo malvagio dal set.

+0

Non invaliderà l'unique_ptr dopo la cancellazione? –

+0

@TasosVogiatzoglou, no non lo farà. Abbiamo spostato l'oggetto dall'insieme 'a' a' tmp' e dopo l'eliminazione l'insieme 'a' contiene l'oggetto' spostato-da' 'unique_ptr'. – ixSci

+0

Oh, ok. Mentre stavo leggendo ho pensato che dopo la cancellazione si chiamasse il deleter. –