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

Podobne dokumenty
Język C++ wykład VIII

STL: Lekcja 1&2. Filozofia STL

Programowanie i struktury danych

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

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

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

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

Zaawansowane programowanie w języku C++ Biblioteka standardowa

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

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

Kontenery i iteratory. Wykorzystanie kontenerów w praktyce.

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

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.

Podstawy Programowania

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

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

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

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

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

1 Pierwsze kroki w C++ cz.3 2 Obsługa plików

dr inż. Jarosław Forenc

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

Kompletna dokumentacja kontenera C++ vector w -

STL Standardt Template Library (wprowadzenie)

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

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

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

Szablon klasy std::vector

Podstawy algorytmiki i programowania - wykład 4 C-struktury

Programowanie i struktury danych

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

Biblioteka standardowa C++

Inicjacja tablicy jednowymiarowej

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

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

Programowanie w językach

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

Programowanie obiektowe i C++ dla matematyków

Wykład 1. Program przedmiotu. Programowanie (język C++) Literatura. Program przedmiotu c.d.:

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Zaawansowane programowanie w C++ (PCP)

Języki programowania obiektowego Nieobiektowe elementy języka C++

Algorytmy i Struktury Danych.

4. Wyrzuć wyjątek jeśli zmienna ist nie istnieje bloki: try, catch i wyrzucanie wyjątku

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Języki programowania. Przetwarzanie tablic znaków. Część druga. Autorzy Tomasz Xięski Roman Simiński

Wzorce funkcji (szablony)

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

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

Podstawy programowania

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

Lista, Stos, Kolejka, Tablica Asocjacyjna

Podstawy programowania w języku C++

Pytania sprawdzające wiedzę z programowania C++

C-struktury wykład. Dorota Pylak

Laboratorium 1. Programowanie II - Kierunek Informatyka. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej

Wyjątki (exceptions)

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

Kurs programowania. Wykład 9. Wojciech Macyna

Projektowanie klas c.d. Projektowanie klas przykład

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

Paradygmaty programowania

Pliki wykład 2. Dorota Pylak

Jak Windows zarządza pamięcią?

Operatory na rzecz typu TString

Podstawy Programowania

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

Szablony klas, zastosowanie szablonów w programach

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:

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

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

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

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

Zaawansowane programowanie w C++ (PCP)

Programowanie komputerowe. Zajęcia 5

Programowanie Komponentowe Zarządzanie obiektami: kontenery

Część 4 życie programu

STL Standard Template Library

DANE TEKSTOWE W JĘZYKU C/C++ - TABLICE ZNAKOWE

Listy powiązane zorientowane obiektowo

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

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

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

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

C-struktury wykład. Dorota Pylak

Paostwowa Wyższa Szkoła Zawodowa w Płocku Dariusz Wardowski

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

C++ Przeładowanie operatorów i wzorce w klasach

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

Podstawy programowania w języku C++

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Wstęp do programowania

Wstęp do informatyki- wykład 7

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

Wstęp do programowania

ZASADY PROGRAMOWANIA KOMPUTERÓW

Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak:

Dzisiejszy wykład. Klasa string. wersja prosta wersja ze zliczaniem odwołań. Wyjątki Specyfikator volatile Semafory

Transkrypt:

Wykład 12 - Biblioteka stadardowa.sxw 1 Przegląd biblioteki standardowej C++; W porównaniu z pierwszymi implementacjami i specyfikacjami C++ biblioteka standardowa języka C++ bardzo się rozrosła, a w latach 90-siątych ubiegłego stulecia wprowadzono szereg radykalnych rozszerzeń. Obecnie istnieje bardzo obszerna cześć tej biblioteki, która jest oparta na wzorcach (STL). W porównaniu z poprzednimi wersjami języka, dzięki wprowadzeniu mechanizmu przestrzeni nazw (namespace) zmianom uległo korzystanie z bardzo popularnej biblioteki strumieniowej, która obecnie jest umieszczona w przestrzeni nazw biblioteki standardowej nazywanej std. Odwołanie się wówczas do operacji zapisu lub odczytu wygląda następująco: #include <iostream> std::cout << "Hello, world!\n"; Zamiast używać nazw kwalifikowanych typu: std::string s = "Cztery nogi Dobrze; dwie nogi Źle!"; std::list<std::string> slogany; można używać następującego zapisu: #include<string> // dostęp do standardowego łańcucha C++ using namespace std; // porzucenie prefiksu std::. string s = "Ignorancja to rozkosz!"; // ok: string std::string W przypadku STL w specyfikacji nazwy pliku nagłówkowego brak rozszerzenia tj. <string> <string.h> zamiast Standardowa biblioteka dostarcza silnego typu łańcuchowego (wcześniej C i C++ nie posiadały wyróżnionego takiego typu i posługiwały się tablicą znaków oraz szeregiem funkcji na niej operującym, nie można było natomiast używać operatorów co jest możliwe obecnie: string s1 = "Hello"; string s2 = "world"; void m1() string s3 = s1 + ", " + s2 + "!\n"; cout << s3; void m2(string& s1, string& s2) s1 = s1 + \n ; // Dodaj znak nowej linii s2 += \n ; // analogiczna operacja. Typ łańcuchowy umożliwia również działanie na podciągach znaków: string name = "Niels Stroustrup"; // nazwisko="niels Stroustrup"; void m3() string s = name.substr(6,10) ; // s = "Stroustrup" name.replace(0,5,"nicholas") ; // A także umożliwia oczywiście porównywanie: string zaklęcie; void respond(const string& odpowiedź) if (odpowiedź == zaklęcie) // dokonaj cudów else if (odpowiedź == "tak") nazwisko = "Nicholas Stroustrup"

Wykład 12 - Biblioteka stadardowa.sxw 2 UWAGA: Oczywiście w rzeczywistym kodzie nie można używać polskich znaków diaktrycznych (ą,ć,... itp.) Ciekawą i często używaną cechą, jest uzyskanie ciągu znaków zakończonego \0 tak jak w standardzie C za pomocą metody c_str() (Identyczna metoda istnieje dla standardowo używanego w C++ Builder typu łańcuchowego AnsiString): printf("nazwisko: %s\n", name.cstr()) ; Dalej jest bezpośrednie przepisanie z tekstu wyświetlanego na wykładzie. Stąd potrzeba dopisywania notatek. Strumieniowe Wejście Ze strumieniowym wejściem i wyjściem spotkaliśmy się już wcześniej przy okazji omawiania wejścia i wyjścia w C. Teraz dodamy jeszcze kilka luźnych uwag. Poniżej obowiązują pliki nagłówkowe <string> i <iostream>; Strumień cin ma też ograniczenia przy wczytywaniu napisów: koniec wczytywania gdy napotkamy biały znak, np. spację. string nap; cout << "Halo! Kim jesteś?: \n"; cin >> nap; cout << "Witaj, " <<nap << "!\n"; W powyższej sytuacji gdy ktoś poda imię + nazwisko, mamy kłopot gdyż zostanie odczytany tylko jeden wyraz. Rozwiązaniem może być użycie funkcji getline wczytującej całą linijkę: string nap; cout << " Halo! Kim jesteś?: \n "; getline(cin, nap) ; cout << " Witaj, " <<nap <<"!\n"; Kontenery Kontenery = klasy utrzymujące kolekcje (zbiory) obiektów różnych typów. Przykład użycia: Program do przechowywania nazwisk i imion, oraz numerów telefonów: W klasycznym podejściu użylibyśmy typu strukturalnego w sposób poniższy.: struct Wpis string ImNazw; int numer; ; Wpis książka_tel[1000] ; void printwpis(int i) cout << książka_tel[i].imnazw<< << książka_tel[i].numer << \n ; Problem: co gdy chcemy dopisać 1001 osobę? WEKTORY: Problem z powyższym kodem polega na tym, że mamy ustaloną liczbę przechowywanych elementów i używając tablic musimy się liczyć z narzutem (tzn. dodatkową robotą) związanym z obsługą nadmiaru i niedomiaru. Biblioteka Standardowa (STL) dostarcza klasę vector, która zajmuje się takimi i podobnymi drobnymi problemami, dobierając dynamicznie rozmiar w zależności od potrzeb, a poza tym można jej używać tak jak standardowych tablic jednowymiarowych.

Wykład 12 - Biblioteka stadardowa.sxw 3 Przykład użycia: vector< Wpis > książka_tel(1000) ; void print_wpis (int i) // użycie jest podobne do użycia tablic cout <<książka_tel[i]. ImNazw << << książka_tel[i].numer << \n ; Funkcje składowe klasy vector umożliwiają dynamiczną zmianę rozmiaru. size() zwraca aktualny rozmiar wektora, a resize() zmienia jego rozmiar. void dodaj_wpisy (int n) // zwiększ rozmiar o n książka_tel.resize(książka_tel.size()+ n) ; Zauważmy różnice w zapisie: vector< Wpis > książka(1000); // wektor 1000 elementów vector< Wpis > książki[1000]; // 1000 pustych wektorów wektor jest pojedynczym obiektem, który można użyć w przypisaniu: Spróbujcie przypisać klasyczną tablicę!!!!. void f(vector< Wpis >& v) vector< Wpis > v2 = książka_tel; v = v2; Sprawdzanie zakresu: Klasycznie: int i = książka_tel[1001].numer; // Klęska: 1001 jest poza zakresem STL: Za pomocą klasy pomocniczej: template<class T> class Vec : public vector<t> public: Vec(): vector<t>() Vec(int s): vector<t>(s) T& operator[](int i) return at(i) ; // + sprawdzanie zakresu const T& operator[](int i) const return at(i) ; / / + sprawdzanie zakresu ; at(n) funkcja zwraca daną spod indeksu n, w wypadku przekroczenia zakresu zgłasza wyjątek out_of_range. Co wykorzystuje się następująco:

Wykład 12 - Biblioteka stadardowa.sxw 4 Vec< Wpis > książka_tel(1000) ; void f() try for (int i = 0; i<10000; i++) print_wpis(i) ; catch (outofrange) cout <<"Przekroczono zakres \n"; Ogólny schemat używania wyjątków: int main() try // twój kod catch (outofrange) cerr << "błąd zakresu \n"; catch (...) // dowolny wyjątek cerr << "Nieznany wyjątek \n ; //cerr to standardowy strumień błędu W zasadzie nie ma potrzeby używania indeksowania w implementacji książki telefonicznej. Czyli nie musimy znać numeru, pod którym przechowywana jest informacja o książce. Stąd lepiej tę funkcję spełniła by lista połączona. STL implementuje ją jako klasę list. list< Wpis > książka_tel; Elementy w liście wyszukujemy po ich wartości (nie indeksie). void print_wpis(const string& s) typedef list< Wpis >::constiterator LI; for (LI i =książka_tel.begin(); i!=książka_tel.end(); ++i) Wpis & e= *i; // referencja jako skrót if (s ==e. ImNazw) cout << e. ImNazw << << e.numer << \n ; Każdy kontener z STL dostarcza funkcji begin() i end(), które zwracają tzw. iterator (odpowiednio początku i końca). Iterator jest obiektem, za pomocą którego odwołujemy się do zawartości klasy kontenerowej i przesuwamy się pomiędzy elementami tej klasy. iterator++ przesuń się do następnego elementu. (iterator jest tutaj dowolną nazwą.) *iterator pobierz ten element (zmienna *iterator jest wówczas równa temu elementowi). Dodawanie do listy jest łatwe: void addwpis(wpis& e, list<wpis>::iterator i)

Wykład 12 - Biblioteka stadardowa.sxw 5 książka_tel.push front(e) ; // dodaj e na początku książka_tel.push back(e) ; // dodaj e na końcu książka_tel.insert(i,e) ; // dodaj e przed elementem // wskazywanym przez i Tablice asocjacyjne (słowniki) typ map Typ map służy do przechowywania par połączonych ze sobą elementów. Przy indeksowaniu wartością jednego elementu z pary, zwracana jest wartość drugiego. map<string,int> książka_tel; void printwpis(const string& s) if (int i = książka_tel[s]) cout << s << << i << \n ; Jeżeli nie zostanie znaleziona wartość kluczowa wówczas zwracana zostaje wartość domyślna dla danego typu. W tym przypadku 0. Co jak się wydaje jest dobrze określoną wartością nie będącą numerem telefonu. Biblioteka standardowa zawiera wiele klas kontenerowych, oto niektóre z nich: Kontenery Standardowe przegląd: vector T wektor o dynamicznym rozmiarze list T lista dwukierunkowa queue T kolejki stack T stos deque T podwójna kolejka priorityqueue T kolejka priorytetowa set T zbiór (elementy nie mogą się powtarzać) multiset T wielozbiór (może zawierać powtarzające się elementy) map key,val tablica asocjacyjna multimap key,val tablica asocjacyjna z kluczem wielokrotnym