2011-02-06 11 views
24

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ć?

+8

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

+1

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

+0

@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

Odpowiedz

45

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)

+1

W twoim przykładzie, co jeśli 'iter' wskazuje już na ostatni element - czy jest to konieczne w specjalnym przypadku? –

+0

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

0

Usuń, a następnie dodaj ją do listy.

+2

To nie jest tak skuteczne, jak wybrana odpowiedź. – Graeme

+0

przy użyciu splice również nie unieważnia iteratorów, podczas gdy to robi – Sopel

4

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.

+3

Nie musisz tego robić w ten sposób, a plakat zbyt szybko zaakceptował odpowiedź. – CashCow

+1

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. –

+3

+1 całkowicie akceptowalne dla pojemnika ze wskaźnikami. Jeśli kopiowanie litery T jest bardziej kosztowne, preferowane powinno być składanie. – sellibitze

Powiązane problemy