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

Podobne dokumenty
Biblioteka standardowa C++

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

Programowanie i struktury danych

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

STL: Lekcja 1&2. Filozofia STL

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

Kontenery i iteratory. Wykorzystanie kontenerów w praktyce.

Zaawansowane programowanie w C++ (PCP)

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

Zaawansowane programowanie w języku C++ Biblioteka standardowa

Język C++ wykład VIII

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

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

STL Standardt Template Library (wprowadzenie)

Wzorce funkcji (szablony)

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

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

Programowanie Komponentowe Zarządzanie obiektami: kontenery

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

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

Jak Windows zarządza pamięcią?

obiekty funkcyjne - funktory

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.

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

STL Standard Template Library

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

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

STL: kontenery. STL: kontenery. STL: kontenery. STL: kontenery. STL: kontenery. STL: kontenery

C++: STL. STL: kontenery. STL: kontenery. STL: kontenery. STL: kontenery. Programowanie Obiektowe C++: Standard Template Library.

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

Szablon klasy std::vector

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

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

Zajęcia nr 5 Algorytmy i wskaźniki. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

C++: STL. STL: kontenery. STL: kontenery. STL: kontenery. STL: kontenery. Programowanie Obiektowe C++: Standard Template Library

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

Zaawansowane programowanie w C++ (PCP)

Kompletna dokumentacja kontenera C++ vector w -

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Programowanie obiektowe

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

Algorytmy i Struktury Danych.

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

Wstęp do programowania obiektowego. STL - Standard Template Library

Stos LIFO Last In First Out

Kurs programowania. Wykład 9. Wojciech Macyna

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

Paradygmaty programowania

Struktury Danych i Złożoność Obliczeniowa

Algorytmika i programowanie. Wykład 2 inż. Barbara Fryc Wyższa Szkoła Informatyki i Zarządzania w Rzeszowie

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

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

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 20 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 32

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

Szablony klas, zastosowanie szablonów w programach

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

Dzisiejszy wykład. Wzorce funkcji Wzorce klas Tablica asocjacyjna Składowe statyczne

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

Wydajność użycia funktorów z biblioteką STL języka C++

Operacje wejścia/wyjścia (odsłona druga) - pliki

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Wstęp do programowania

Język C++ część 9 szablony klas. Jarosław Gramacki Instytut Informatyki i Elektroniki. szablony funkcji

Język C++ Różnice między C a C++

Stos liczb całkowitych

Definicja szablonu klasy. Korzystanie z szablonu. Specjalizacja metody szablonu.

Dziedziczenie & W slajdach są materiały zapożyczone z

Listy i funkcje zaprzyjaźnione w C++

Ćwiczenia IV - Kontenery (pojemniki)

Zaawansowane programowanie w C++ (PCP)

Język C++ wykład VI. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VI. dr Jarosław Mederski.

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

C-struktury wykład. Dorota Pylak

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

Operatory na rzecz typu TString

Operacje wejścia/wyjścia odsłona pierwsza

Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26

Wstęp do programowania obiektowego. Przekazywanie parametrów do funkcji w C++ Metody i funkcje operatorowe Strumienie: standardowe, plikowe, napisowe

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30

Część 4 życie programu

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.

Programowanie w języku C++

typ y y p y z łoż o on o e n - tab a lice c e w iel e owym m ar a o r we, e stru r kt k ury

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

Programowanie i struktury danych. Wykład 4 Dr Piotr Cybula

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Kontenery, algorytmy

STL: implementowanie algorytmów C++: STL. STL: implementowanie algorytmów. STL: implementowanie algorytmów. STL: implementowanie algorytmów

Technologie cyfrowe semestr letni 2018/2019

Programowanie obiektowe i C++ dla matematyków

Podstawy Programowania

Programowanie komputerowe. Zajęcia 5

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia

Lista, Stos, Kolejka, Tablica Asocjacyjna

Wstęp do programowania

Tworzenie aplikacji w języku Java

Podstawy programowania skrót z wykładów:

ZASADY PROGRAMOWANIA KOMPUTERÓW

Transkrypt:

1 Wstęp Biblioteka standardowa C++ Wejście/wyjście (iostream) Napisy (string) Napisy jako strumienie (sstream) STL Standard Template Library Pojemniki (kolekcje) Iteratory (wyliczanie elementów) Algorytmy (sortowanie, etc.) Efektywne i wygodne klasy dla typowych zadań związanych z kolekcjami obiektów. 2 Pojemniki Pojemniki Pojemnik to obiekt, którego zadaniem jest przechowywanie innych obiektów. W STL pojemniki oparte są na wzorcach. Rodzaje pojemników (kolekcji) Sekwencyjne (wektor, lista, kolejka) Asocjacyjne (słowniki) Nieuporządkowane (zbiór, multizbiór) Caveat: STL jest dużą i skomplikowaną biblioteką, na wykładzie poruszymy tylko najprostsze zagadnienia. Pojemniki Pojemniki z STL przechowują kopie obiektów. Obiekty przechowyane muszą posiadać odpowiedni konstruktor kopiujący. Zniszczenie pojemnika pociąga za sobą zniszczenie obiektów w nim przechowywanych. Jeśli przechowujemy wskaźniki do obiektów to obiekty wskazywane przez nie nie są niszczone. 1

3 Iteratory Iteratory Iteratory to obiekty slużące do poruszania się po pojemnikach. Uogólnienie wskaźników Iteratory umożliwiają Intuicja Ujednolicenie dostępu do pojemników Równoczesny dostęp do jednego pojemnika przez wiele iteratorów Różne rodzaje dostępu T tab[10]; T* begin = tab; T* end = tab+9; for(t* it=begin; it!= end; it++) f(*it); Chcemy podobnie przechodzić po zawartości pojemnika, nawet jeśli nie jest on tablicą: list<t> l; list<t>::iterator it; for(it=l.begin(); it!= l.end(); it++) f(*it); 4 vector vector Pojemnik przeznaczony do przechowywania indeksowanych sekwencji (najlepiej o określonym z góry rozmiarze) Dostarcza operacji indeksowania [] i at(), dodania i usuwania elementu na końcu wektora push_back() i pop_back() wydajne o ile nie trzeba zwiększać pojemności, dodania i usuwanie elementu w środku insert() i erase() mało wydajne 2

Rozmiary Wektor ma zawsze określoną pojemność; przy jej przekroczeniu zawartość jest automatycznie kopiowana do większego pojemnika. Informacji o pojemności dostarcza metoda capacity() Informacji o maksymalnej możliwej pojemności dostarcza metoda max_size() (dla G++/Linux 10 9 ) Informacji o liczbie elementów dostarcza metoda size() Możemy z góry zarezerwować pewien rozmiar metodą reserve(rozmiar) Przykład #include <vector> #include <iostream> using namespace std; vector<int> v; for(int i=0;i<15;i++) v.push_back(i); cout <<"Rozmiar "<< v.size() <<" Pojemność: "<< v.capacity()<< endl; Rozmiar 1 Pojemność: 1 Rozmiar 2 Pojemność: 2 Rozmiar 3 Pojemność: 4 Rozmiar 4 Pojemność: 4 Rozmiar 5 Pojemność: 8 Rozmiar 6 Pojemność: 8 Rozmiar 7 Pojemność: 8 Rozmiar 8 Pojemność: 8 Rozmiar 9 Pojemność: 16 Rozmiar 10 Pojemność: 16 Rozmiar 11 Pojemność: 16 Rozmiar 12 Pojemność: 16 Rozmiar 13 Pojemność: 16 3

Rozmiar 14 Pojemność: 16 Rozmiar 15 Pojemność: 16 Zmiany rozmiaru Przekroczenie zarezerwowanego rozmiaru pamięci powoduje Przydzielenie nowego większego rozmiaru pamięci Skopiowanie elementów ze starego przedziału do nowego Zniszczenie starych elementów Dealokację starego obszaru pamięci Jeśli elementy są duże i mają kosztowne konstruktory i/lub destruktory może to być czasochłonne. Przechodzenie wektora indeksy typedef vector<int> Liczby; Liczby v; for(int i=0;i<15;i++) v.push_back(i); for(int i=0;i<v.size();i++) cout << v[i] << endl; Ale jeśli zamienimy wektor na inny pojemnik, to nie zadziała... Przechodzenie wektora iterator typedef vector<int> Liczby; Liczby v; for(int i=0;i<15;i++) v.push_back(i); for(liczby::iterator i=v.begin();i<v.end();i++) cout << *i << endl; Ten kod zadziała nawet jeśli zamienimy wektor na inny pojemnik (byle definiował iterator). 4

Jeszcze o zaletach iteratorów template<class Iterator> void printit(iterator fst, Iterator last, string sep) for(iterator it=fst; it!= last; it++) cout << *it << sep ; vector<int> v; for(int i=0;i<15;i++) v.push_back(i); printit(v.begin(),v.end()," ") ; 5 list list Pojemnik przeznaczony do przechowywania sekwencji z wstawianiem/usuwaniem w dowolnym miejscu. Dostarcza operacji dodania i usuwania elementu na końcu push_back() i pop_back() wydajne (tak jak dla wektora), dodania i usuwania elementu na początku push_front() i pop_front() wydajne (tak jak dla wektora), dodania i usuwanie elementu w środku insert() i erase() wydajne (inaczej niż dla wektora) Uwaga: nie ma indeksowania! Przykład #include <list> #include <iostream> using namespace std; list<int> v; for(int i=0;i<15;i++) 5

v.push_front(i); while(v.size()) cout << v.front()<< ; v.pop_front(); // 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 W ten sposób mamy stos (LIFO) może się przydać w programie zaliczeniowym. Przykład #include <list> #include <iostream> using namespace std; list<int> L; L.push_back(0); L.push_front(1); L.insert(++L.begin(), 2); printit(l.begin(), L.end()," "); // 1 2 0 6 deque deque Double Ended Queue (kolejka o dwóch końcach) Pojemnik przeznaczony do przechowywania indeksowanych sekwencji z wstawianiem/usuwaniem na obu końcach. Dostarcza operacji indeksowania [] i at(), dodania i susuwania elementu na końcu wektora push_back() i pop_back() dodania i usuwania elementu na początku push_front() i pop_front() dodania i usuwanie elementu w środku insert() i erase() 6

Przykład #include <deque> #include <iostream> using namespace std; deque<int> Q; Q.push_back(3); Q.push_front(1); Q.insert(Q.begin() + 1, 2); Q[2] = 0; // Tu było 3 printit(q.begin(), Q.end()," "); // 1 2 0 Co możemy przechowywać? Typ elementów T pojemnika powinien implementować co najmniej: Konstruktor kopiujący T(const& T) Operator przypisania Operator równości == Operator nierówności == takie, że T a(b); assert(a == b); a = b; assert(a == b); a == a a == b wtw b == a a!= b wtw!(a == b) 7 Asocjacje set Pojemnik przechowujący uporządkowane zbiory elementów. 7

Typ elementu powinien definiować relację (operator) < Przykład antyzwrotną antysymetryczną przechodnią #include <set> set<string> indeks; string slowo; while(cin >> slowo) indeks.insert(slowo) ; printit(indeks.begin(),indeks.end()," "); // Wejście: Ala ma kota kota Ala ma // Wyjście: Ala kota ma map map<key,value> reprezentuje słownik o kluczach typu key i wartościach typu value. Typ kluczy powinien implementować operację < jak dla set Dostarcza operacji indeksowania, np. map<string,int> slownik; slownik["answer"] = 42; W rzeczywistości przechowywane są pary, o których można myśleć jako template<class key,class val> struct pair key first; val second; 8

Przykład map<string,int> indeks; string slowo; while(cin >> slowo) if(indeks.count(slowo)) indeks[slowo]++; else indeks[slowo]=1; printit(indeks.begin(),indeks.end()," "); // Wejście: Ala ma kota kota Ala ma kota kota ma // Wyjście: Ala:2 kota:4 ma:3 Wypisywanie par Tym razem, żeby funkcja printit zadziałała, musimy zdefiniować operator << dla par: template<class key,class val> ostream& operator<<(ostream& os, pair<key,val> p) os << p.first << : << p.second; return os; multiset i multimap Warianty set imap, w których elementy (klucze) mogą się powtarzać Podobnie jak inne pojemniki asocjacyjne dostarczają metody count(element), podającej ilość wystąpień elementu (klucza). Dla set i map, metoda count może dać w wyniku tylko 0 lub 1. Napisy jako strumienie sstream Nagłówek sstream deklaruje klasy pozwalające na czytanie/pisanie do/z napisów tak jak dla innych strumieni Dla pisania: klasa ostrstream Dla czytania: klasa istrstream 9

Przykład #include <string> #include <iostream> #include <sstream> using namespace std; string s("42"); istringstream is(s); int answer; is >> answer; cout << answer << endl ; return 0; 10