2010-11-15 11 views
10

Tengo dos contenedores, digamos que están definidos así:¿Cómo manejar el 'emplace_range' que falta en C++ 0x STL?

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

Supongamos tanto a y b están pobladas. Quiero insertar todo el contenedor a en una ubicación particular en b, usando move-semántica para que el unique_ptr se mueva a b. Supongamos i es un iterador válido en algún lugar en b. El siguiente no funciona:

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

¿Hay otro algoritmo STL que pueden lograr esto 'insert-gama-de-movimiento'? Supongo que necesito un tipo de emplace_range, pero no hay uno en el STL de VS2010. No quiero escribir un bucle que se inserte uno por uno, ya que terminaría siendo un desagradable O (n^2) debido a que cambia el contenido completo del vector cada vez que se inserta. ¿Alguna otra opción?

Respuesta

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. No sabía sobre 'make_move_iterator'. – AshleysBrain

+1

VS2010 es compatible con esto. Bueno. –

4

Usted insert número requerido de elementos en blanco en el objetivo (en una toma) y luego use swap_ranges. Los elementos fuente van a ser inútiles de todos modos, ya que es unique_ptr.

Esto haría trabajo para pre-C++ 0x, pero la otra respuesta es claramente mejor para Visual C++ 10.

+0

Sería, si hubiera un 'unique_ptr' pre-C++ 0x;) Pero es un buen truco de todos modos. – AshleysBrain