C++/Iteratory: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Lethern (dyskusja | edycje)
+< source>, poprawki
Lethern (dyskusja | edycje)
poprawki
Linia 92:
// wyswietlenie skladnikow wektora tab w petli przy pomocy iteratora
vector<int>::iterator iit;
for( iit=tab.begin(); iit!=tab.end(); ++iit )
{
cout<< *iit <<'\n';
}
return 0;
Linia 119:
// wyświetlenie skladników wektora tab w pętli przy pomocy odwróconego iteratora
vector<int>::reverse_iterator iit;
for( iit=tab.rbegin(); iit!=tab.rend(); ++iit )
{
cout<<*iit<<'\n';
}
return 0;
Linia 134:
Należy jeszcze podkreślić, że przy użyciu odwróconego iteratora, by przejrzeć wszystkie elementy pojemnika nie używamy -– a ++! Rzeczywiście, chcemy przejrzeć wektor od końca do początku i właśnie ku temu służy odwrócony iterator – zdefiniowany w nim porządek strukturalny jest odwrotny do porządku w zwykłym iteratorze.
 
Powyższe przykłady pokazują jak dużym ułatwieniem dla korzystania z iteratorów są przeładowane operatory inkrementacji i dekremntacji: '''operator++''' i '''operator--''', których używamy tu jak na zwykłej liczbie int. Mamy tu także '''operator=''' podstawienia, jak i porównanie iteratorów - '''operator<!='''.
 
=== Listy jedno- i dwukierunkowe ===
Linia 154:
 
// i wyswietlamy ja w petli do przodu
list<char>::iterator iit;
cout<<"lista po kolei: ";
for( iit=lista.begin(); iit!=lista.end(); ++iit )
{
cout<<*iit<<" ";
}
 
//i oraz do tylu (ale czy poprawnie?)
cout<<"\nLista od tylu: ";
for( i it= lista.end(); iit!=lista.begin(); --iit )
{
cout<<*iit<<" ";
}
 
// znow wyswietlamy liste - teraz przy pomocy odworconego iteratora
list<char>::reverse_iterator i2it2;
cout<<"\nLista od tylu z odwroconym iteratorem: ";
for( i2it2=lista.rbegin(); i2 it2!= lista.rend(); i2it2++ )
{
cout<<*i2it2<<" ";
}
cout<<'\n';
Linia 184:
lista od tylu z odwroconym iteratorem: c b a
 
Przykład ten pokazuje nam dlaczego do przeglądania kontenera od końca należy używać iteratora odwróconego. Wyświetlenie elementu równego <tt>lista.end()</tt> przyniosło niespodziewany skutek - losowy symbol spoza naszej listy.
 
W liście jednokierunkowej nie mamy już tak szerokiego zakresu działania na iteratorach. Funkcje begin() i end() zwracają wartości iteratora (jednokierunkowego) „do przodu”, zaś odwrotny iterator wcale nie istnieje.
Linia 190:
 
===Zbiory===
 
Iterator w zbiorach działa jak w innych kontenerach. Iterator działający na zbiorze jest dwukierunkowy – możemy więc korzystać ze wszystkich operatorów przeciążonych dla iteratora dwukierunkowego. Dodatkowo (jak z własności zbioru wynika) należy wspomnieć, że metoda '''begin()''' daje dostęp iteratorowi do pierwszego elementu zbioru, który równocześnie posiada najniższy klucz. W zbiorach możemy także korzystać z odwróconych iteratorów.
<source lang="cpp">
Linia 198 ⟶ 197:
int main()
{
int o;
set<int> zbior;
zbior.insert(5);
Linia 205 ⟶ 203:
zbior.insert(11);
 
set<int>::iterator iit; // teraz iit jest wskaznikiem do zbioru
for( iit=zbior.begin(); iit!=zbior.end(); ++iit )
cout<<*iit<<'\n';
 
return 0;