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 poruszający się w odwrotnej kolejności:
rbegin()irend() - Algorytmy STL operujące na iteratorach
- Pętla
forzakresowa 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 wektor.h) dodając do niej obsługę iteratorów.
Klasa Wektor powinna udostępniać:
- iterator o swobodnym dostępie (random access iterator) typu
Wektor::iterator, który udostępnia operatorit++przesuwający iterator do następnego elementu sekwencji i operator*itwydobywają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
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 random_shuffle()
- wypisz zawartość wektora korzystając z pętli
forzakresowej
Obsługa wyjątków
- std::exception - klasa wyjątków biblioteki standardowej
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
stringprzechowują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
ZlyIndeksWektoradziedziczy po klasieWyjatek.
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
BrakPamiecidziedziczy po klasieWyjątek.
Obiekt tej klasy rzucamy gdy zabraknie pamięci przy zwiększaniu wektora.
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 <new.h> int *a = new(std::nothrow) int[1]; if(a==0) throw "Brak pamieci";
- Klasy
BrakPamieciiZlyIndeksWektoradziedziczą po klasieWyjatek, 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 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ątekstd::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ę 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 Zadanie 9

