2010-11-15 4 views
10

ich zwei Behälter haben, lassen Sie uns sagen, dass sie wie folgt definiert sind:Wie behandelt man fehlende 'emplace_range' in C++ 0x STL?

std::vector<std::unique_ptr<int>> a; 
std::vector<std::unique_ptr<int>> b; 

beide Angenommen a und b bestückt sind. Ich möchte den gesamten Container a an einer bestimmten Stelle in b einfügen, mit Bewegungs-Semantik, so dass die unique_ptr s zu b verschieben. Nehmen wir an, i ist ein gültiger Iterator irgendwo in b. Die folgende funktioniert nicht:

b.insert(i, a.begin(), a.end()); // error: tries to copy, not move, unique_ptrs 

Gibt es einen anderen STL-Algorithmus, der diese 'Insert-Bereich-by-moving' erreichen kann? Ich denke, ich brauche eine Art von emplace_range, aber es gibt keine in STL von VS2010. Ich möchte nicht eine Schleife schreiben, die eins nach dem anderen einfügt, da dies zu einem ekligen O (n^2) führen würde, weil der gesamte Inhalt des Vektors bei jedem Einfügen nach oben verschoben wird. Irgendwelche anderen Wahlen?

Antwort

17
auto a_begin = std::make_move_iterator(a.begin()); 
auto a_end = std::make_move_iterator(a.end()); 

b.insert(i, a_begin, a_end); 
+2

Awesomeness. Wusste nicht über 'make_move_iterator'. – AshleysBrain

+1

VS2010 unterstützt dies. Gut. –

4

Sie insert die erforderliche Anzahl von leeren Elementen im Ziel (in einem Schuss) und dann swap_ranges verwenden. Die Quellelemente werden sowieso nutzlos sein, da dies unique_ptr ist.

Diese würde Arbeit für Pre-C++ 0x, aber die andere Antwort für Visual C++ deutlich besser ist 10.

+0

Es wäre, wenn es ein 'unique_ptr' pre-C++ 0x;) Aber es ist sowieso ein netter Trick. – AshleysBrain