2012-07-05 16 views
10

Zastanawiam się, co jest powodem, dla którego std::list<>::splice unieważnia Iteratory odnoszące się do podciągu łączonego w nowym kontenerze. Jest to dla mnie trochę nielogiczne, szczególnie w świetle standardowej specyfikacji std::container::swap. Zgodnie ze standardem językowym std::container::swap nie unieważnia żadnych iteratorów. Jest to całkowicie uzasadniona praktyczna specyfikacja. Jednakże, powiedziałbym, że std::list<>::splice również skorzystałby w dużej mierze z zachowania zachowującego iteratory.std :: list <> :: splice unieważnia Iteratory. Racjonalne uzasadnienie?

Rozumiem, że mogą istnieć pewne czysto naukowe rozważania oparte na koncepcjach osiągalności iteratora, itp. Ale jednocześnie splice jest specyficzną operacją, oznaczającą, że dostarczenie dostosowanej dla niej specyfikacji prawdopodobnie nie poważnie uszkodzić koncepcję projektu STL.

Co to było? Czy zabroniłoby to lub nadmiernie komplikować niektóre praktyczne implementacje std::list, których nie potrafię rozpoznać?

+0

możliwy duplikat [splice() na std :: list i iterator unieważnienie] (http://stackoverflow.com/questions/143156/splice-on-stdlist-and-iterator-invalidation) – jwismar

Odpowiedz

7

W języku C++ 11 splice nie powoduje unieważnienia iteratorów, ale powoduje, że odnoszą się do odpowiednich elementów w kontenerze *this. Wszystko to opisano w 23.3.5.5.

+0

Oh, OK. Właśnie to znalazłem. Tak więc, najwyraźniej nie było uzasadnionego wymogu unieważnienia. Moje pytanie powstaje głównie po sprawdzeniu, ile kółek i pętli Microsoft musi przeskoczyć w ich implementacji STL, aby zapewnić obsługę "iteratora debugowania" zarówno dla 'swap' i' splice'. Dziękuję za odpowiedź. – AnT

+0

@AndreyT "Tak, najwyraźniej nie było żadnego powodu, by wymagać unieważnienia." "Nie bardzo. W pewnym momencie komitet chciał w pełni wspierać _unequal_ alokatory pamięci, a te alokatory nie są kompatybilne, więc niektóre kopie będą potrzebne w tym szczególnym przypadku. – curiousguy

4

Jeśli pojemniki zostały dostosowane, nierówne (niekompatybilne) podzielniki, nie można zamienić wskaźników, nie masz wyboru, jak naprawdę kopiować elementy wokół.