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.
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()' –