2013-02-27 34 views
5

Piszę iterator (w rzeczywistości jest to const_iterator dla mojego obecnego obiektu i chcę także stworzyć reverse_const_iterator również.C++ iterator i reverse iterator

Rozejrzałem się, aby zobaczyć, jak to zrobić i ja natknął this.

jednak zauważyć, że kiedy iterator ulega odwróceniu, odwrócona wersja nie wskazują na ten sam element w tym zakresie, ale do jednej go poprzedzający jest to więc, w celu ustalenia dla ostatniego-endowego elementu z zakresu: An it erator wskazujący na element typu koniec-koniec w odwróceniu, jest zmieniany w taki sposób, aby wskazywał na ostatni element (nie przez ten zakres) (byłby to pierwszy element zakresu, jeśli odwrócono by wartość ). A jeśli iterator pierwszego elementu w zakresie jest odwrócony, odwrócony iterator wskazuje na element przed pierwszym elementem (byłby to element końca okresu z zakresu, jeśli odwrócono by ).

Czy to, co się dzieje z perspektywy użytkownika, lub gdy dereference w reverse_iterator robi to nie abstrakcyjny to z dala od co daje wartość/referencję obiektu uważasz jest wskazując? Czy to tylko szczegół implementacji?

Moje zrozumienie było:

for(i = obj.rbegin(); i != obj.rend(); i++) 

była równoważna

for(i = obj.begin(); i != obj.end(); i++) 

wyjątkiem w odwrotnej kolejności. Tak więc *i przejdzie do tyłu przez pojemnik w pierwszym przypadku i przejdzie do przodu przez pojemnik w drugim przypadku. Czy mój instynkt jest poprawny?

+2

po prostu działa. –

+0

Uwaga: podczas pracy z iteratorami zawsze powinieneś używać przyrostu wstępnego ('++ i') zamiast post-inkrementacji, ponieważ może on być bardziej wydajny. –

Odpowiedz

5

Masz rację, że to abstrakcja. Odwrotny iterator zawiera normalny iterator, który wskazuje na element za obiektem, który uzyskałbyś, gdybyś go odesłał. Jednak nie jest to tylko szczegół implementacji. Adapter std::reverse_iterator zapewnia wywołanie funkcji składowej base, które zwraca podstawowy iterator.

standard określa std::reverse_iterator jako adapter iteracyjnej z następującym stosunku do iteracyjnej jego dostosowania:

Podstawowy związek pomiędzy odwrotnej iteracyjnej i odpowiadającą jej iteracyjnej i ustala tożsamość: &*(reverse_iterator(i)) == &*(i - 1)

Typowym zastosowaniem jest usuwanie base element od pojemnika, które są wykonane w taki sposób:

it++; 
lst.erase(it.base()); 

Jeśli chcesz to zrobić podczas iteracji nad kontenera w odwrotnej kolejności, by zrobić:

it++; 
std::list<int>::reverse_iterator(lst.erase(it.base())); 
+0

Jako pytanie uboczne, dlaczego byłoby to przydatne, aby uzyskać 'podstawowy' bazowy' iterator'? – Bingo

+0

@Bingo: ponieważ kontenery mogą się tego spodziewać, na przykład 'wymazanie' jest określone jako przyjmowanie' iteratora' i * nie * '' odwrotnego_tekstora'. –

+0

@Matthieu oh, racja. To ma sens. – Bingo