2012-12-20 9 views
6

Buduję std::list elementów (struktur elementów grafu), które są okresowo łączone razem. Pomysł polega na tym, że jeśli odkryję węzeł łączący dwa komponenty, staną się one jednym komponentem, a moja lista wylicza moje składniki. Każdy komponent ma uchwyt (w tym przypadku std::list<component>::iterator) do swojego "nadrzędnego" komponentu, który jest ustawiony po scaleniu. W ten sposób, aby określić składnik, do którego należy dany węzeł, chodzę w górę tego łańcucha.Usuń element ze std :: list, pozostawiając go przydzielonego

W końcu to, co szukam jest operacja na std::list który pozwala mi brać iterator elementu, N i usunąć go z listy, ale bez dealokując go: struktura reszty wykazu jest modyfikowany w taki sam sposób, jak normalne usuwanie.

Najlepiej coś mniej brzydkiego niż ponowne przydzielenie elementu, skopiowanie go z listy i wywołanie rzeczywistego remove lub .

Być może uda mi się to osiągnąć dzięki splice. Musiałbym splatować elementy, które mają zostać usunięte, do "śmieci" list, czyż nie?

+5

"łączenie" w listę _junk_ brzmi prawie prawidłowo ... –

+0

Takie podejście ma mało prawdopodobne prawdopodobieństwo, że użycie niekompatybilnych alokatorów wymusi kopiowanie. Nadal ... tam kilka dodatkowych wskaźników się tasuje. Cóż ... nie boli *, że mam sposób na powtórzenie moich nie w pełni osieroconych węzłów. –

+0

Dlaczego używanie listy zamiast listy jest nieodpowiednie dla Ciebie? –

Odpowiedz

1

Możesz to zrobić z łączeniem. Na przykład, przesuń *it do listy śmieci:

junk.splice(junk.begin(),comp_list,it); 

Można również dodać move-konstruktor do component. Następnie, przed usunięciem z treści lista przejść do tmp var, coś takiego:

component tmp(*it); 
li.erase(it); 

także sugestia Fomin Arsenij do listy wskaźników do komponentów (lub std::shared_ptr) stosowanie jest zbyt dobra.

+0

zwykła 'lista ' prawdopodobnie spowoduje więcej ręcznego prowadzenia księgowości niż jest to konieczne, ale 'list >' jest prawdopodobnie również solidnym podejściem. Chciałem zachować prostotę: dzięki podejściu do listy śmieci można uniknąć pisania słowa kluczowego "new". –