====== Iteratory ======
* [[https://pl.wikibooks.org/wiki/C%2B%2B/Iteratory|Iterator]] - obiekt umożliwiający wygodny dostęp sekwencyjny do elementów kontenera bez konieczności znajomości jego struktury
* Rodzaje iteratorów:
* iterator wejścia (tylko do odczytu) i wyjścia (tylko do modyfikacji)
* iterator jednokierunkowy (operator ''%%++%%'') i dwukierunkowy (operator ''%%++%%'' i ''%%--%%'')
* iterator swobodnego dostępu - przypomina w użyciu wskaźnik, przeciąża dodatkowo operatory: ''%%+, +=, -, -=, []. <, >, <=, >=%%''
* Iterator początku kolekcji ''begin()'', iterator końca kolekcji ''end()'' \\ {{zajecia:po:begin_end_iterator.png?400|}}
* Iterator poruszający się w odwrotnej kolejności: ''rbegin()'' i ''rend()''
* [[https://cplusplus.com/reference/algorithm/|Algorytmy STL]] operujące na iteratorach
* Pętla ''for'' zakresowa od C%%++%%11
int tab [] = {42, 3, 5};
// odczyt kolekcji
for(auto x: tab)
{
cout << x << endl;
}
// modyfikacja kolekcji
for(auto &x: tab)
{
x++;
}
===== Ćwiczenie: Iteratory klasy Wektor =====
Rozszerz implementację szablonu klasy ''Wektor'' z poprzednich zajęć (plik {{https://github.com/IS-UMK/po_2025_src/blob/master/09_szablon_wektor/wektor.h|wektor.h}}) dodając do niej obsługę iteratorów. \\ Klasa ''Wektor'' powinna udostępniać:
* iterator o swobodnym dostępie ([[http://www.sgi.com/tech/stl/RandomAccessIterator.html|random access iterator]]) typu ''Wektor::iterator'', który udostępnia operator ''it%%++%%'' przesuwający iterator do następnego elementu sekwencji i operator ''*it'' wydobywający wskazywany element
* metodę ''begin()'' zwracającą iterator bezpośredniego dostępu pokazujący na pierwszy element
* metodę ''end()'' zwracająca iterator pokazujący za ostatnim elementem
W tym przypadku iterator swobodnego dostępu będzie po prostu wskaźnikiem typu T*. Wystarczy więc przezwać ten typ używając polecenia ''typedef'' lub ''using''.
Napisz program, który przetestuje działanie iteratorów w klasie ''Wektor'':
* wypełnij wektor liczbami całkowitymi 1, 2, 3, 4 ....
* wymieszaj zawartość wektora algorytmem [[https://en.cppreference.com/w/cpp/algorithm/random_shuffle|random_shuffle()]]
* wypisz zawartość wektora korzystając z pętli ''for'' zakresowej
======= Obsługa wyjątków =======
* [[https://pl.wikibooks.org/wiki/C%2B%2B/Obs%C5%82uga_wyj%C4%85tk%C3%B3w|Obsługa wyjątkow]]
* [[https://en.cppreference.com/w/cpp/error/exception|std::exception]] - klasa wyjątków biblioteki standardowej
{{zajecia:po:wyjatki.png?600|}}
**Przykład:**
try
{
int a=1;
throw a;
}
catch(int b)
{
// wyjatek typu int
}
catch(...)
{
// wszystkie wyjatki
}
===== Ćwiczenie: Wyjatkowe sytuacje klasy Wektor =====
W pliku nagłówkowym ''wyjatki.h'' zadeklaruj klasy wyjątków: ''**Wyjatek**'', ''**ZlyIndeksWektora**'' i ''**BrakPamieci**'' i dodaj do szablonu klasy Wektor polecenia rzucające obiekty tych klas w razie zaistnienia sytuacji wyjątkowych.
* Klasa ''**Wyjatek**'', stanowi ogólną klasę wyjątków po której będą dziedziczyły wszystkie inne typy wyjątków. Klasa ta zawiera:
* pole chronione typu ''string'' przechowujące komunikat o błędzie. \\ Komunikat ustawiany jest przez konstruktor, np. : ''**throw Wyjatek("Pojawil sie nieoczekiwany blad!")**''.
* metodę publiczną ''**Komunikat()**'' zwracająca tekst komunikatu.
* Klasa ''**ZlyIndeksWektora**'' dziedziczy po klasie ''**Wyjatek**''. \\ Obiekt tej klasy będzie rzucany gdy podamy niepoprawny indeks tablicy (wektora). \\ Klasa zawiera publiczne pole typu całkowitego inicjowane przez konstruktor, przechowujące wartość złego indeksu. \\
* Klasa ''**BrakPamieci**'' dziedziczy po klasie ''**Wyjątek**''. \\ Obiekt tej klasy rzucamy gdy zabraknie pamięci przy zwiększaniu wektora.
W zależności od konfiguracji, operator ''**new**'' w przypadku wystąpienia błędu może także rzucać wyjątek. Można temu zapobiec wymuszając aby w przypadku błędu operator ten zwracał NULL.
#include
int *a = new(std::nothrow) int[1];
if(a==0) throw "Brak pamieci";
* Klasy ''**BrakPamieci**'' i ''**ZlyIndeksWektora**'' dziedziczą po klasie ''**Wyjatek**'', więc:
* przeciążają odpowiednie konstruktory pozwalające dodać komunikat o błędzie przy tworzeniu obiektu (obiekty każdej z tych klas powinny być inicjowane odpowiednim domyślnym komunikatem)
* zasłaniają metodę ''**Komunikat()**'' zwracając tekst odpowiednio sformatowany z zależności od sytuacji (od typu obiektu).
Napisz program, który wywoła sytuacje wyjątkowe dla klasy ''Wektor'' i spowoduje rzucenie wyjątków ''ZlyIndeksWektora'' oraz ''BrakPamieci''. Złap wyjątki i wypisz komunikat błedu.
===== Zadanie 9: Sortowanie liczb i słów =====
Napisz program, który posortuje liczby i wyrazy wprowadzone przez użytkownika.
**Dane wejściowe:**
* użytkownik wprowadza dane w konsoli, podając kolejne linie tekstu
* każda linia może zawierać dowolny ciąg znaków
* jeśli linia zawiera poprawnie zapisaną liczbę rzeczywistą, jest traktowana jako wartość numeryczna (a nie jako napis) i zostaje zamieniona na wartość typu ''double''
**Zasady przetwarzania danych:**
* konwersja napisu na liczbę odbywa się za pomocą funkcji [[https://en.cppreference.com/w/cpp/string/basic_string/stof|stod()]]
* jeśli konwersja na ''double''' za pomocą ''stod()'' zakończy się sukcesem, liczba jest dodawana do kolekcji liczb
* jeśli konwersja nie powiedzie się (np. napis nie jest liczbą), funkcja rzuca wyjątek ''std::invalid_argument'' - wtedy linia trafia do kolekcji napisów
* jeśli liczba wykracza poza zakres typu ''double'' (funkcja rzuca wyjątek ''std::out_of_range''), linia jest ignorowana (nie trafia ani do liczb, ani do napisów)
**Wynik działania programu:**
Program przestaje wczytywać dane, gdy użytkownik wprowadzi pustą linię (długość napisu równa 0).
Następnie program wypisuje:
* wszystkie rozpoznane liczby posortowane w kolejności rosnącej
* wszystkie pozostałe napisy posortowane alfabetycznie
Do kolekcjonowania napisów i liczb wykorzystaj klasę ''Wektor'' a do posortowania obu sekwencji wykorzystaj funkcję [[https://en.cppreference.com/w/cpp/algorithm/sort|sort()]] z biblioteki STL.
**Przykład działania programu:**
Dla danych wejściowych
zxcvbn
1234
asdf
42
3.14
qwerty
10e100000
10e2
program wypisze
Liczby:
3.14
42
1000
1234
Napisy:
asdf
qwerty
zxcvbn
Rozwiązanie w postaci plików nagłówkowych ''*.h'' i źródłowych ''*.cpp'' umieść w Moodle [[https://moodle.umk.pl/mod/assign/view.php?id=299400|Zadanie 9]]