Discussion:
STL, list<>::end()
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Lech Lorens
19 lat temu
Permalink
Szukałem w książkach i internecie, ale nie znalazłem odpowiedzi. Jeśli
pobiorę iterator wskazujący na koniec listy:

list<int>::iterator end = l.end();

wykonam na liście jakieś operacje (insert, remove, itd.), to czy po tych
operacjach nadal mam gwarancję, że

end == l.end()

?
--
Pozdrawiam,
Lech Lorens - ***@snerol_hcel
Tanglor
19 lat temu
Permalink
Post by Lech Lorens
Szukałem w książkach i internecie, ale nie znalazłem odpowiedzi. Jeśli
list<int>::iterator end = l.end();
wykonam na liście jakieś operacje (insert, remove, itd.), to czy po tych
operacjach nadal mam gwarancję, że
end == l.end()
?
--
Pozdrawiam,
A cóż stoi na przeszkodzie, by za każdym razem, gdy tego
potrzebujesz, sprawdzać czy dotarłeś do końca listy ?
Poza tym dowolna operacja zmieniająca skład listy nie powoduje
unieważnienia iteratora tak długo jest iterator nie wskazuje na
usuwany element. Tak jak w tym przypadku.
Tomek
19 lat temu
Permalink
Post by Tanglor
A cóż stoi na przeszkodzie, by za każdym razem, gdy tego
potrzebujesz, sprawdzać czy dotarłeś do końca listy ?
Poza tym dowolna operacja zmieniająca skład listy nie powoduje
unieważnienia iteratora tak długo jest iterator nie wskazuje na
usuwany element. Tak jak w tym przypadku.
no aj ka jest z iteratorami np dla vectora??
Paweł Kierski
19 lat temu
Permalink
Post by Tomek
Post by Tanglor
A cóż stoi na przeszkodzie, by za każdym razem, gdy tego
potrzebujesz, sprawdzać czy dotarłeś do końca listy ?
Poza tym dowolna operacja zmieniająca skład listy nie powoduje
unieważnienia iteratora tak długo jest iterator nie wskazuje na
usuwany element. Tak jak w tym przypadku.
no aj ka jest z iteratorami np dla vectora??
Dla vectora - nie. Wystarczy chwilę pomyśleć, czym jest wektor 8-)
Unieważnienie jest możliwe przy każdej realokacji (która wystąpi na
pewno przy wstawianiu, gdy size() == capacity()) i występuje zawsze
dla wszystkich elementów za wstawianym elementem.
--
Paweł Kierski
***@pkierski.net
dodaj "[nomorespam]" w temacie jeśli piszesz z domeny innej niż .pl,
albo koniecznie chcesz obejść moje filtry 8-)
Seweryn Habdank-Wojewódzki
19 lat temu
Permalink
Witam
Post by Lech Lorens
Szukałem w książkach i internecie, ale nie znalazłem odpowiedzi. Jeśli
list<int>::iterator end = l.end();
wykonam na liście jakieś operacje (insert, remove, itd.), to czy po tych
operacjach nadal mam gwarancję, że
end == l.end()
To zależy. std::vector nie daje takiej gwarancji - operacje wstawiania i
usuwania niszczą układ wskaźników, tak samo jak dla tablic.

Ale są kontenery, które to zachowują np. std::list i o ile dobrze pamiętam
std::deque też. poszukaj w FAQ listy, linku do dinkumware i tam poczytaj o
kontenerach, albo zobacz do Josuttisa.

Pozdrawiam.
--
|\/\/| Seweryn Habdank-Wojewódzki
`\/\/
Maciej Pilichowski
19 lat temu
Permalink
On Fri, 23 Jun 2006 09:32:49 +0000 (UTC), Lech Lorens
Post by Lech Lorens
wykonam na liście jakieś operacje (insert, remove, itd.), to czy po tych
operacjach nadal mam gwarancję, że
end == l.end()
AFAIR tak, ale musialbym zerknac do Josuttisa. Poniewaz mozesz zrobic
to i Ty, wiec nie bede Cie wyreczal *smile*.

milego dnia, hej
--
Maciej "MACiAS" Pilichowski http://bantu.fm.interia.pl/

M A R G O T --> http://www.margot.cad.pl/
automatyczny tłumacz (wczesna wersja rozwojowa) angielsko-polski
Maciej Borzecki
19 lat temu
Permalink
Post by Lech Lorens
Szukałem w książkach i internecie, ale nie znalazłem odpowiedzi. Jeśli
list<int>::iterator end = l.end();
wykonam na liście jakieś operacje (insert, remove, itd.), to czy po tych
operacjach nadal mam gwarancję, że
end == l.end()
?
Tak sobie mysle, co stoi na przeszkodzie zeby napisac kawalek kodu i
sprawdzic?

Maciek
Jedrzej Dudkiewicz
19 lat temu
Permalink
Post by Maciej Borzecki
Post by Lech Lorens
Szukałem w książkach i internecie, ale nie znalazłem odpowiedzi. Jeśli
list<int>::iterator end = l.end();
wykonam na liście jakieś operacje (insert, remove, itd.), to czy po tych
operacjach nadal mam gwarancję, że
end == l.end()
?
Tak sobie mysle, co stoi na przeszkodzie zeby napisac kawalek kodu i
sprawdzic?
Bo takie rozwiązanie może być niepoprawne i przypadkiem zadziałać.

JD
Bronek Kozicki
19 lat temu
Permalink
Post by Lech Lorens
list<int>::iterator end = l.end();
end == l.end()
chyba tak, ale nie mam pod ręką ... czekaj, mam. Ale nie chce mi się szukać w
normie ISO ;-P


B.
Sektor van Skijlen
19 lat temu
Permalink
Post by Lech Lorens
Szukałem w książkach i internecie, ale nie znalazłem odpowiedzi. Jeśli
list<int>::iterator end = l.end();
wykonam na liście jakieś operacje (insert, remove, itd.), to czy po tych
operacjach nadal mam gwarancję, że
end == l.end()
Co do end, owszem, masz taką gwarancję. Lista jest bardzo liberalna jeśli
chodzi o unieważnianie iteratorów - unieważniane są tylko te iteratory, które
wskazują na usuwane elementy. Oczywiście w pozostałych zbiornikach już nie
jest tak pięknie :)
--
// _ ___ Michal "Sektor" Malecki <sektor(whirl)kis.p.lodz.pl>
\\ L_ |/ `| /^\ ,() <ethouris(O)gmail.com>
// \_ |\ \/ \_/ /\ C++ bez cholesterolu: http://www.intercon.pl/~sektor/cbx
"I am allergic to Java because programming in Java reminds me casting spells"
Loading...