2010-11-15 14 views
10

mam dwa pojemniki, powiedzmy, że są one zdefiniowane następująco:Jak radzić sobie z brakującą 'emplace_range' w C++ 0x STL?

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

Załóżmy zarówno a i b są wypełniane. Chcę wstawić cały kontener a do określonej lokalizacji w b, używając semantyki ruchu, aby unique_ptr przesunie się do b. Załóżmy, że i jest poprawnym iteratorem, który znajduje się gdzieś w b. Poniższa nie działa:

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

Czy istnieje inny algorytm STL, który może osiągnąć „insert-zakres-by poruszających”? Chyba potrzebuję pewnego rodzaju emplace_range, ale nie ma jednego w STL VS2010. Nie chcę pisać pętli wstawiającej jeden po drugim, ponieważ skończyłoby się nieprzyjemnym O (n^2) z powodu przesunięcia całej zawartości wektora przy każdym wstawieniu. Jakieś inne opcje?

Odpowiedz

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. Nie wiedziałem o 'make_move_iterator'. – AshleysBrain

+1

VS2010 obsługuje to. Dobry. –

4

You insert Wymagana liczba pustych elementów w celu (w jednym ujęciu), a następnie użyj swap_ranges. Elementy źródłowe i tak będą bezużyteczne, ponieważ jest to unique_ptr.

Ten by praca dla pre-C++ 0x, ale z drugiej odpowiedzi jest wyraźnie lepszy dla Visual C++ 10.

+0

Byłoby, gdyby było 'unique_ptr' pre-C++ 0x;) Ale i tak jest to fajna sztuczka. – AshleysBrain

Powiązane problemy