2015-05-05 8 views
7

Ich habe zwei Sätze und einen Iterator auf ein Element von a:Verschieben `unique_ptr`s zwischen den Sätzen

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

Ich möchte das Element durch iter von a und legen Sie sie in b darauf entfernen. Ist es möglich? Wie?

+0

@black: Ich glaube, dass die Frage in sich geschlossen ist. Wenn Sie klug genug sind zu antworten, sollten die Probleme für Sie offensichtlich sein. – ybungalobill

+0

Meiner Meinung nach sollte das Problem jedoch in der Frage offensichtlich sein und nicht verlangen, dass Sie etwas codieren, das angezeigt wird. Das Problem, das ich sehe, könnte anders sein als das, was Sie sehen. Ich bekomme Probleme mit "const", was ist mit dir? – edmz

+1

@black: Sie müssen nichts programmieren. In der Tat habe ich nicht einmal versucht, irgendeinen Code zu kompilieren, weil ich die Sprache gut genug kenne, um zu wissen, dass Einfügen und Löschen nicht funktioniert. Die Frage richtet sich an diejenigen, die den C++ - Standard gut genug kennen und mich auf einen bestimmten Teil der Schnittstelle std :: set oder eine Kombination davon hinweisen können, die das erreichen würde, was ich brauche. Die Frage ist da, und wenn Sie denken, dass jedes Problem in SO zu einem Compilerfehler führt, zu schade für Sie. – ybungalobill

Antwort

2

Nun, ich vermute, es gibt keinen normalen Weg, es zu tun. Aber es gibt immer eine nicht-normale :) können Sie wie folgt vorgehen:

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

Ok, die erste Zeile verletzt set invariant, und es ist schrecklich, aber soweit ich verstehe es sollte kein Problem sein, denn auf der nächsten Zeile entfernen wir diesen bösen Knoten aus der Menge.

+0

Wird dadurch das unique_ptr beim Löschen nicht ungültig gemacht? –

+0

@TasosVogiatzoglou, nein wird es nicht. Wir haben das Objekt von "a" nach "tmp" verschoben und beim Löschen enthält "a" das Objekt "moved-from" "unique_ptr". – ixSci

+0

Oh, ok. Als ich es gelesen habe, dachte ich, dass beim Löschen der Deleter aufgerufen wird. –