2012-09-27 17 views
7

Powiel możliwe:
Is there a standard way of moving a range into a vector?C++ 11 ruch wstawiania do std :: deque lub std :: Lista

rozumiem całkiem dobrze jak RValue odniesienia pracować, ale jestem nie do końca pewny, jak działają z iteratorami w STL. Oto coś, co chcę:

void insertList(std::list<int>& L, std::list<int>&& R, std::list<int>::iterator insertPoint) 
{ 
    L.insert(insertPoint, R.begin(), R.end()); // want to use move semantics 
} 

Teraz wiem, że std :: list ma metodę splice. Ale chcę wiedzieć, czy to może w ogóle zadziałać. Czy to też działa dla Deque?

+3

Głosowanie w celu ponownego otwarcia. Podczas gdy istnieje część, która jest dzielona z pytaniem oznaczonym jako duplikat (przechodzenie do 'deque'), istnieje również część, która jest bardzo różna' list <> 'i dla której rozwiązanie w połączonym pytaniu jest gorsze niż alternatywne 'splice()' –

Odpowiedz

11

splice i ruchu zawartość pojemników są różne operacje. W przypadku splice (którego nie można wykonać za pomocą deque) cały węzeł jest przenoszony z jednego kontenera do drugiego. Węzły nie będą już znajdować się w oryginalnym pojemniku i żadna alokacja nie zostanie wykonana przez operację.

Alternatywą ruchu te treści z algorytmu podobnego do tego, który stwierdził, ale przy użyciu przesunie iterator:

L.insert(insertPoint, 
     std::make_move_iterator(R.begin()), 
     std::make_move_iterator(R.end())); 

to będzie działać zarówno list i deque ale semantyka różnią . Wstawienie do nowej listy będzie wymagać przydzielenia węzłów std::distance(R.begin(),R.end()), których zawartość zostanie wypełniona przez przeniesienie z oryginalnego kontenera. Zmniejsza to koszty tworzenia nowych węzłów, ale mimo to muszą zostać przydzielone. Zauważ, że stara lista nadal będzie zawierała wszystkie węzły, ale będą one puste, ponieważ zawartość danych została przeniesiona.

W przypadku std::list powinieneś preferować splice, ale nie jest to możliwe w przypadku innych pojemników. W przypadku innych pojemników pozostaniemy z powyższym podejściem, w którym trzeba będzie ponieść koszty budowy struktury danych kontenera, chociaż można uniknąć kosztu utworzenia przechowywanych danych.

+0

+1 za udzielenie poprawnego wyjaśnienia. ; -] – ildjarn

+0

+1 dobre wyjaśnienie na temat poruszania iteratorów, dziękuję – Walter

Powiązane problemy