Mam już wskaźnik katalogowej CDrawObject *lista Move elementu do końca w STL
std::list<CDrawObject*> elements;
Jak mogę przenieść jakiś element na końcu listy. Widzę STL Algorithms Reference, ale nie znajduję tych operacji. Jak mogę to zrobić?
Mam już wskaźnik katalogowej CDrawObject *lista Move elementu do końca w STL
std::list<CDrawObject*> elements;
Jak mogę przenieść jakiś element na końcu listy. Widzę STL Algorithms Reference, ale nie znajduję tych operacji. Jak mogę to zrobić?
pomocą sklejenia metodą listy()
void list::splice (iterator position, list<T,Allocator>& x, iterator i);
Move iterację i z listy X na bieżącej liście w pozycji "pozycji"
przemieszczając w ten sposób, że do końca umieścić
x.splice(x.end(), x, iter);
(obie mogą być tą samą listą lub różnymi listami, o ile lista, z której element jest przenoszony, ma ten sam typ, zarówno T, jak i Allocator)
W twoim przykładzie, co jeśli 'iter' wskazuje już na ostatni element - czy jest to konieczne w specjalnym przypadku? –
Nie powinno być konieczne testowanie, a funkcja biblioteki powinna nadal działać. To, czy byłby optymalny, nie jest pewne, ponieważ specyfikacja C++ mówi tylko o tym, jaki musi być wynik funkcji, a nie o tym, czy należy ją wykonać w najbardziej optymalny sposób. – CashCow
A std::list
jest podwójnie połączoną listą, co oznacza, że nie masz losowego dostępu do elementu n
. Ty
musisz usunąć
, a następnie użyć push_back
.
Nie musisz tego robić w ten sposób, a plakat zbyt szybko zaakceptował odpowiedź. – CashCow
Nie miałem na myśli "trzeba" w sensie "to jedyny sposób", ale w każdym razie, @ G-71, nie wahaj się zaakceptować mojej odpowiedzi, jeśli inna odpowiedź jest lepsza. –
+1 całkowicie akceptowalne dla pojemnika ze wskaźnikami. Jeśli kopiowanie litery T jest bardziej kosztowne, preferowane powinno być składanie. – sellibitze
Nie jest w 100% związane z pytaniem, ale czy na pewno połączona lista wskaźników jest rozsądnym wyborem struktury danych? Jest tylko kilka przypadków, w których uważam, że jest to najlepsza opcja ... – 6502
To jest to, co robi to przenoszenie elementu ze środka listy do końca. lista jest jedyną kolekcją, w której robi się to w stałym czasie. – CashCow
@CashCow: Ten czas, choć stały, może nadal być dłuższy niż trwa 'std :: memmove()' zawartość 'std :: vector 'kontenerów, szczególnie gdy aspekty takie jak lokalność danych (pamięć podręczna CPU) jest brany pod uwagę. – sbi