Kontenery i iteratory. Wykorzystanie kontenerów w praktyce.

Podobne dokumenty
Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.)

Programowanie i struktury danych

Programowanie w C++ Wykład 7. Katarzyna Grzelak. 23 kwietnia K.Grzelak (Wykład 7) Programowanie w C++ 1 / 40

Programowanie w C++ Wykład 6. Katarzyna Grzelak. 1 kwietnia K.Grzelak (Wykład 6) Programowanie w C++ 1 / 43

STL: Lekcja 1&2. Filozofia STL

Szablony funkcji i klas (templates)

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

Biblioteka standardowa C++

Pojemniki Pojemnik to obiekt, którego zadaniem jest przechowywanie innych obiektów.

STL Standardt Template Library (wprowadzenie)

Zaawansowane programowanie w C++ (PCP)

Programowanie Komponentowe Zarządzanie obiektami: kontenery

Wyjątki (exceptions)

Listy i funkcje zaprzyjaźnione w C++

Zaawansowane programowanie w języku C++ Biblioteka standardowa

Programowanie Obiektowo Zorientowane w języku C++ Biblioteka STL

Dla każdej operacji łącznie tworzenia danych i zapisu ich do pliku przeprowadzić pomiar czasu wykonania polecenia. Wyniki przedstawić w tabelce.

Struktury Danych i Złożoność Obliczeniowa

Kompletna dokumentacja kontenera C++ vector w -

Jak Windows zarządza pamięcią?

STL Standard Template Library

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

java.util.* :Kolekcje Tomasz Borzyszkowski

Kurs programowania. Wykład 9. Wojciech Macyna

Języki Programowania. Prowadząca: dr inż. Hanna Zbroszczyk. tel: Konsultacje: piątek:

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Programowanie w języku Java. Kolekcje

Biblioteka STL - wstęp. Biblioteka STL - literatura. Biblioteka STL - przegląd. Biblioteka STL - kwestie techniczne

W przypadku STL w specyfikacji nazwy pliku nagłówkowego brak rozszerzenia tj. <string> <string.h> zamiast

Programowanie w C++ z użyciem kontenerów - parę przykładów programów Opracowanie: dr hab. Mirosław R. Dudek, prof. UZ

Aby uzyskać zaliczenie w pierwszym terminie (do 30 stycznia 2018) rozliczyć trzeba co najmniej 8 projektów, po 4 z każdej z części: C++ oraz Python.

Krótkie wprowadzenie do STL. XIV LO im. S. Staszica, K06 D

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 7 maja K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31

Podstawy programowania 2. Przygotował: mgr inż. Tomasz Michno

Tworzenie aplikacji w języku Java

Język C++ wykład VIII

Struktury danych: stos, kolejka, lista, drzewo

A. USYTUOWANIE MODUŁU W SYSTEMIE STUDIÓW

10.1 Szablony Szablony funkcji Szablony klas Szablony jako wstęp do biblioteki STL... 10

Programowanie i struktury danych

STL: kontenery. Typy kontenerów STL. STL: kontenery. STL: kontenery. STL: kontenery. Typy kontenerów STL. deque (double-ended queue) list

Algorytmy i Struktury Danych.

Wykład 4. Klasa List Kolejki Stosy Słowniki

Jak napisać listę jednokierunkową?

Stos LIFO Last In First Out

Kolekcje - pakiet Java Collections Framework

Ćwiczenia IV - Kontenery (pojemniki)

Programowanie w C++ Wykład 6. Katarzyna Grzelak. kwiecień K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40

Przeciążanie funkcji. Przykład 1: #include <iostream> using namespace std; double srednia(double n1, double n2) { return ((n1 + n2)/2.

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Lista, Stos, Kolejka, Tablica Asocjacyjna

Tablice cz. I Tablice jednowymiarowe, proste operacje na tablicach

Przeciążanie operatorów

Wykład 7 Abstrakcyjne typy danych słownik (lista symboli)

Podstawy programowania w języku C++ Zadania

Kontenery. Wykład 12. Programowanie (język C++) Rodzaje kontenerów. Przegląd kontenerów

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Kolekcje mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

Utworzenie pliku. Dowiesz się:

Programowanie Obiektowe (Java)

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Zasady programowania Dokumentacja

Technologie programowania Wykład 4. Szablony funkcji Notes. Szablony funkcji Notes. Szablony funkcji Notes. Notes. Przemek Błaśkiewicz.

Materiał uzupełniający do ćwiczen z przedmiotu: Programowanie w C ++ - ćwiczenia na wskaźnikach

8. Wektory. Przykłady Napisz program, który pobierze od użytkownika 10 liczb, a następnie wypisze je w kolejności odwrotnej niż podana.

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Część 4 życie programu

Sortowanie. Bartman Jacek Algorytmy i struktury

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

WSTĘP DO INFORMATYKI. Struktury liniowe

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Java niezbędnik programisty spotkanie nr 8. Kolekcje c.d.

Informatyka 1. Wyrażenia i instrukcje, złożoność obliczeniowa

Programowanie Obiektowew języku C++ Zadania L2

Algorytmy sortujące i wyszukujące

Opisy efektów kształcenia dla modułu

STL: kontenery. STL: kontenery. STL: kontenery. Typy kontenerów STL. STL: kontenery. STL: kontenery. multimap. Kontener map: przykład zadanie:

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Kolekcje - pakiet Java Collections Framework

Programowanie Obiektowew języku C++ Zadania L2

Kolekcje. Na podstawie:

Szablon klasy std::list

Materiał Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Wskaźniki Tablice dynamiczne Referencje Funkcje

Algorytmy i Struktury Danych. Anna Paszyńska

Programowanie komputerowe. Zajęcia 1

Wykorzystanie elementów z biblioteki standardowej C++: vector, list, complex oraz string.

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw

Paradygmaty programowania

Szablon klasy std::vector

Algorytmy i struktury danych. Wykład 4 Tablice nieporządkowane i uporządkowane

Laboratorium 1 - Programowanie proceduralne i obiektowe

Dynamiczne struktury danych

Transkrypt:

Instrukcja laboratoryjna nr 2 Programowanie w języku C 2 (C++ poziom zaawansowany) Kontenery i iteratory. Wykorzystanie kontenerów w praktyce. dr inż. Jacek Wilk-Jakubowski mgr inż. Maciej Lasota dr inż. Tomasz Kaczmarek

Wstęp W poprzednim semestrze studenci kierunku informatyka poznali jeden kontener będący częścią standardowej biblioteki szablonów języka C++ (ang. Standard Template Library STL), a mianowicie kontener vector. Teraz przyszedł czas na poznanie kolejnych. Lista dwukierunkowa Lista dwukierunkowa, czyli klasa list jest kolejnym kontenerem udostępnianym przez bibliotekę STL. Dostęp do elementów listy dwukierunkowej jest możliwy tylko przy użyciu iteratorów w odróżnieniu od wektora, do którego elementów dostęp jest możliwy zarówno przy pomocy iteratorów jak i przez podanie indeksu. Dodawanie i usuwanie elementów listy jest szybsze niż dodawanie i usuwanie elementów wektora, poza tym operacje te w przypadku listy realizowane w stałym czasie w odróżnieniu od wektora, dla którego czas dostępu zależy od usytuowania elementu w kontenerze. Trzecią, dość istotną różnicą pomiędzy klasą list oraz klasą vector jest to, że adresy elementów listy są niezmienne, natomiast adresy elementów wektora ulegają dość częstym zmianom. Sposób korzystania z list bardzo przypomina korzystanie z wektorów. Oto przykład wykorzystania listy: #include <list> // Nagłówek <list> zawiera deklarację // std::list int main() // Tak wygląda utworzenie pustej listy typu int i // nazwanie jej lista: list <int> lista; // Aby umieścić na końcu listy pojedynczy element, // używamy funkcji "push_back():" lista.push_back(1); // Aby usunąć pojedynczy element z końca listy, używam // funkcji "pop_back()": lista.pop_back(); // Funkcja "push_front()" umieszcza pojedynczy element na // początku listy: lista.push_front(0); // Teraz pierwszym elementem jest // 0, a nie 1

// Podobnie, funkcja "pop_front()" usuwa pierwszy element // listy: lista.pop_front(); Iteratory Iteratory usprawniają pracę związaną z obsługą kontenerów. Poza tym umożliwiają dotarcie do danego składnika pojemnika bez konieczności poznawania jego struktury. Posługiwanie się iteratorem przypomina używanie zwykłych wskaźników. Jest on jednak czymś więcej niż wskaźnik - w przeciwieństwie do wskaźników, korzystając z iteratora nie musimy martwić się czy przypadkiem nie przekroczyliśmy zakresu pojemnika ani czy poprawnie wskazuje on na wybrany element. Tym wszystkim zajmuje się sam iterator, co pozwala programiście skupić się na innych problemach w trakcie tworzenia programu. Oto przykład wykorzystania iteratorów do wyświetlania elementów listy dwukierunkowej: #include <iostream> #include <list> int main () list<int> lista; // Inicjujemy listę kolejnymi liczbami naturalnymi: lista.push_back(1); lista.push_back(2); lista.push_back(3); // Wyświetlenie składników listy w pętli przy pomocy iteratora przejścia w // przód: list<int>::iterator it; for( it=lista.begin(); it!=lista.end(); ++it ) cout<< *it <<'\n'; Metody begin() i end() skonstruowane są do przeglądania kontenera od początku do końca. Jeśli chcemy działać na składowych listy w odwrotnej kolejności korzystamy w tym celu z metody rbegin(), która zwraca odwrócony iterator wskazujący na ostatni element pojemnika (mówi się także, że jest to odwrócony początek). Odwołuje się on do elementu

bezpośrednio poprzedzającego iterator wskazywany przez end. Jest to odwrócony iterator bezpośredniego dostępu. Mamy także metodę rend(), która zwraca odwrócony iterator do elementu odwołującego się do elementu bezpośrednio poprzedzającego pierwszy element kontenera list (zwany także odwróconym końcem). rend() wskazuje miejsce bezpośrednio poprzedzające składnik do którego odwoływałby się begin(). Oto przykład: #include <iostream> #include <list> int main () list<int> lista; // Inicjujemy listę kolejnymi liczbami naturalnymi: lista.push_back(1); lista.push_back(2); lista.push_back(3); // Wyświetlenie składników listy w pętli przy pomocy iteratora przejścia w // przód: list<int>::reverse_iterator it; for( it=lista.rbegin(); it!=lista.rend(); ++it ) cout<< *it <<'\n'; Zbiory Zbiory są jednym z kontenerów biblioteki STL, których struktura oparta jest na drzewach. Elementy które są w nich przechowywane są posortowane, według pewnego klucza. Drzewiasta struktura zapewnia szybkie wyszukiwanie, jednak są z tym związane także pewne mankamenty, mianowicie modyfikacja elementu jest możliwa tylko w taki sposób, że kasujemy stary element, a następnie wstawiamy w to miejsce nowy. Zbiory są tzw. kontenerami asocjacyjnymi (o zmiennej długości, pozwalającymi na operowanie elementami przy użyciu kluczy). Oto przykład wykorzystujący kontener set: #include<iostream> #include<set>

int main() set<int> zbior; zbior.insert(4); zbior.insert(3); zbior.insert(1); zbior.insert(2); set<int>::iterator it; for( it=zbior.begin(); it!=zbior.end(); ++it ) cout<<*it<<'\n'; Mapy Mapy są posortowanymi kontenerami asocjacyjnymi, czyli zbiornikami o zmiennej długości gromadzącymi dane, które można dodawać i usuwać. Nie można jednak dodawać danych na konkretną pozycje, ponieważ kolejność ustalana jest według danego klucza. Mapa jest również parowym zbiornikiem asocjacyjnym, czyli jej elementami są pary wartości klucz i dana. Pierwszej wartości (first), czyli klucza mapy, nie można zmieniać, natomiast druga wartość czyli wartość danej (second) jest możliwa do zmiany. Mapa jest w końcu unikalnym kontenerem asocjacyjnym, co oznacza, że każdy element ma indywidualny klucz. Oto przykład wykorzystujący kontener map: #include<iostream> #include<map> int main() map<int, string> miesiac; miesiac[1] = "styczen"; miesiac[2] = "luty"; miesiac[3] = "marzec"; miesiac[4] = "kwiecien"; miesiac[5] = "maj"; miesiac[6] = "czerwiec"; miesiac[7] = "lipiec"; miesiac[8] = "sierpien"; miesiac[9] = "wrzesien"; miesiac[10] = "pazdziernik"; miesiac[11] = "listopad";

miesiac[12] = "grudzien"; cout << "5 miesiac to: " << miesiac[5] << '\n'; map<int, string>::iterator cur; // zwrócenie elementu o kluczu 5 cur = miesiac.find(5); // pierwszy sposób dostępu do klucza i danej cout<<cur->first<<" miesiąc to: "<<cur->second<<endl; // drugi sposób dostępu do klucza i danej cout<<(*cur).first<<" miesiąc to: "<<(*cur).second<<endl; // elementy o kluczach większych i mniejszych map<int, string>::iterator prev = cur; map<int, string>::iterator next = cur; ++next; --prev; cout << "Wczesniejszy, czyli "<<(*prev).first<<" element mapy to " << (*prev).second << '\n'; cout << "Nastepny, czyli "<<next->first<< " element mapy to "<< next->second << '\n'; Zadania do wykonania 1. Napisać program, który będzie implementował stos przy pomocy kontenera list. W szczególności chodzi o umożliwienie wykonywanie takich operacji jak umieszczanie elementu na stosie, zdejmowanie elementu ze stosu, wyświetlanie zawartości stosu, przy użyciu prostego menu. 2. Napisać program, który będzie implementował listę uczniów w klasie przy pomocy kontenera set. W szczególności chodzi o umożliwienie wykonywanie takich operacji jak umieszczanie ucznia na liście, usuwanie ucznia z listy, wyświetlanie listy uczniów, przy użyciu prostego menu. 3. Napisać program, który będzie implementacją słownika angielsko-polskiego przy pomocy kontenera map. W szczególności chodzi o umożliwienie wykonywanie takich operacji jak umieszczanie słowa angielskiego wraz z odpowiednim tłumaczeniem w słowniku, wyszukanie słowa angielskiego i wyświetlenie odpowiednika polskiego, wyświetlenie zawartości słownika na ekranie, przy użyciu prostego menu.