Standard Template Library

Slides:



Advertisements
Podobne prezentacje
STRUKTURY DANYCH.
Advertisements

Sortowanie przez scalanie
Algorytmy sortowania i porządkowania
Algorytmy sortowania i przeszukiwania
C++ wykład 9 ( ) Szablony.
C++ wykład 4 ( ) Przeciążanie operatorów.
Kurs języka C++ Paweł Rzechonek Instytut Informatyki
C++ Paweł Rzechonek Instytut Informatyki Uniwersytetu Wrocławskiego
C++ wykład 13,14,15 (16/23/ ) STL.
Standardowa biblioteka języka C++
1 Dzisiejszy wykład Klasa string wersja prosta wersja ze zliczaniem odwołań Wyjątki Specyfikator volatile.
Programowanie obiektowe
Zaawansowane techniki algorytmiczne
Haszowanie Jakub Radoszewski.
Wprowadzenie.
PROGRAMOWANIE STRUKTURALNE
Informatyka Stosowana
Elementarne struktury danych Piotr Prokopowicz
OOPC++ - dziedziczenie1 Uwagi VS2003 Wykłady (nie na rainbow!)
STL - Standard Template Library 2 (STL od źródeł, czyli specyfikacja biblioteki) Autor: Błażej Chodarcewicz rainbow.mimuw.edu.pl/~bc189380/STL/
Sortowanie Zajęcia 13.
PHP vs. ASP PHP – lider wydajności wśród języków skryptowych.
Standard Template Library
Kurs WWW – wykład 5 Paweł Rajba
Wykład 2 struktura programu elementy języka typy zmienne
Algorytmika w drugim arkuszu maturalnym. Standardy wymagań I. WIADOMOŚCI I ROZUMIENIE I. WIADOMOŚCI I ROZUMIENIE II.KORZYSTANIE Z INFORMACJI II.KORZYSTANIE.
Podstawy Informatyki zajęcia dla Studentów I-go roku studiów na Wydziale Fizyki i Informatyki Stosowanej AGH Dr inż. Piotr Gronek Zakład Informatyki Stosowanej.
Techniki i języki programowania
Podstawy programowania II Wykład 2: Biblioteka stdio.h Zachodniopomorska Szkoła Biznesu.
Programowanie obiektowe III rok EiT
Algorytmy i struktury danych
Zbiór do posortowania mieści się w pamięci
Podstawy programowania II
Algorytmy i Struktury Danych Sortowanie
Algorytmy i Struktury Danych Typy algorytmów
Algorytmy i struktury danych
Podstawy Programowania
Programowanie obiektowe III rok EiT
Programowanie obiektowe III rok EiT dr inż. Jerzy Kotowski Wykład VIII.
Programowanie obiektowe III rok EiT dr inż. Jerzy Kotowski Wykład IX.
Programowanie obiektowe III rok EiT
Tablice w Turbo Pascalu.
Kurs języka C++ – wykład 13 ( )
Kurs języka C++ – wykład 8 ( )
Programowanie w języku C++
Kurs języka C++ – organizacja zajęć ( )
K URS JĘZYKA C++ – WYKŁAD 10 ( ) Szablony.
Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski 1 informatyka +
Kurs języka C++ – wykład 4 ( )
K URS JĘZYKA C++ – WYKŁAD 1 ( ) Łagodne wprowadzenie do języka C++
Przestrzenie nazw, strumienie. Przestrzenie nazw Przestrzeń nazw – co to takiego? Przestrzeń nazw – co to takiego?namespace Kiedy potrzebujemy przestrzeni.
Klasy String i Vector Zajęcia 9. Klasa String Atutem języka C++ jest biblioteka standardowych szablonów STL (Standard Template Library), która udostępnia.
Zbiory dynamiczne.
Mapa STL – C++. Problem polega na tym, że najczęściej chcielibyśmy przechowywać w zbiorze elementy jakiegoś bardziej złożonego typu, których on nie będzie.
Standard Template Library Czyli Es Te El. Co to jest? Po polskiemu STL to standardowa biblioteka szablonów, czyli biblioteka C++ zawierająca algorytmy,
ALGORYTMY I STRUKTURY DANYCH
STOS. STL (ang. Standard Template Library) jest to biblioteka zawierająca algorytmy, pojemniki, iteratory oraz inne konstrukcje w formie szablonów, gotowe.
K URS JĘZYKA C++ – ORGANIZACJA ZAJĘĆ ( ) Paweł Rzechonek Instytut Informatyki Uniwersytetu Wrocławskiego.
C++ mgr inż. Tomasz Turba Politechnika Opolska 2016.
C++ WYKŁAD 13 ( ) Algorytmy. S PIS TREŚCI Funktory i predykaty Funkcje lambda.
Wyższa Szkoła Informatyki i Zarządzania W Bielsku-Białej Kierunek informatyka Specjalność : Systemy informatyczne Praca dyplomowa inżynierska : System.
Listy.
Kurs języka C++ – organizacja zajęć ( )
Programowanie obiektowe II
Programowanie obiektowe Wykład 10
Podstawy programowania
Założenia projektowe Javy
C++ wykład 12 ( ) Kolekcje standardowe.
Programowanie w Javie 1 Dr Robert Kowalczyk
Zapis prezentacji:

Standard Template Library

Książki o STL i bibliotece standardowej C++ Nicolai M. Josuttis: C++ Standard Library: A tutorial and Reference, 1st, Pearson 1999, przykłady: http://www.josuttis.com/libbook/examples.zip (Polska wersja: Nicolai M. Josuttis: C++ Biblioteka standardowa Podręcznik Programisty, Helion 2003, przykłady: ftp://ftp.helion.pl/przyklady/cpbspp.zip) Nicolai M. Josuttis: C++ Standard Library: A tutorial and Reference, 2nd, Addison Wesley Longman 2012, (uwzględnia standard C++11) Grębosz J.: Pasja C++, RM, W-wa Inne (wspomniane na pierwszym wykładzie o C++, w tym ANSI/ISO C++ standard)

Biblioteka standardowa języka C++ Biblioteka zawiera klasy strumieniowe klasy łańcuchowe STL Standard Template Library (największa i najintensywniej rozwijana część biblioteki) Dawniej używano nagłówków (obsolete): „*.h”, „*.hpp”, „*.hxx” Znacząco rozszerzona w standardzie C++11 (głównie część STL) Rozszerzenia języka i bibliotek C++11 nie są jeszcze w pełni wspierane przez kompilatory; wykład o C++11 na przedmiocie MiNWO poświęcony będzie nowemu standardowi C++

STL Główne składniki STL to biblioteka wzorców! Kontenery (listy, wektory, etc.) Iteratory (interfejs pomiędzy algorytmami a kontenerami) Algorytmy (proste, nie bardziej skomplikowane od wyszukiwania i sortowanie) Inne (obiekty funkcyjne, adaptory, ...) STL to biblioteka wzorców! Dane odseparowane od metod (a co z ideą OOP?) Zaprojektowane dla programowania wysokopoziomowego Zaprojektowane dla programowania wydajnego

BTW: rząd złożoności algorytmu O-notacja Wyszukiwanie w posortowanej tablicy: O(log2(n)) Wyszukiwanie w nieuporządkowanej tablicy: O(n) quicksort: O(n · log2(n)) Sortowanie bąbelkowe: O(n2)

Kontenery Sekwencyjne Asocjacyjne vector (tablica dynamiczna) dequeue (tablica dynamiczna dwukierunkowa) list (lista dwukierunkowa) (tablica i string nie są kontenerami STL, ale można je przetwarzać za pomocą algorytmów STL) Asocjacyjne set (drzewo binarne) multiset map, multimap

Kontenery vector Zaimplementowany jako tablica dynamiczna szybkie push_back() szybki operator[] wolne insert()

Kontenery deque Zaimplementowany jako tablica dynamiczna szybkie push_back() (vector może być szybszy) szybkie push_front() (nieobsługiwany przez vector) szybki operator[] wolny insert()

Kontenery list Zaimplementowana jako lista dwukierunkowa szybkie push_back() szybkie push_front() szybkie insert() Nie ma operatora operator[]

Iteratory Iteratory zachowują się jak zwyczajne wskaźniki ... * -> ++ -- == != = (vector, deq: -, <, >, +(int) ) Ale działają dla wszystkich kontenerów! container.begin() // zwróć iterator do pierwszego elementu. container.end() // ... do ostatniego przykład: list2.cpp

Kontenery set Zaimplementowany jako drzewo binarne Sowrtowanie przy wstawianiu (porównywanie domyślnym operatorem<() ) Odpowiednik zbiorów matematycznych metoda find() szybkie insert() nie ma: push_back() nie ma: push_front() nie ma: operatora []

Kontenery multiset Dozwolone powtórzenia tej samej wartości Uporządkowanie wewnątrz grupy elementów o tych samych wartościach jest niezdefiniowane

Kontenery multimap multiset dla par: klucz, wartość – użyj make_pair()

Kontenery map Tylko dla kontenera map: operator[key]() set dla par: klucz, wartość – użyj make_pair() Tylko dla kontenera map: operator[key]() Indeksowanie wartością (tablica asocjacyjna)

Algorytmy STL Operują na kontenerach za pomocą iteratorów Sposób uniwersalny, ale nie tak szybki jak metody kontenerów Dla niektórych kombinacji algorytm/kontener wolne Możliwe jednoczesne działanie na kontenerach różnych typów Tylko podstawowe, proste algorytmy Parametryzowalne przez romaite iteratory Parametryzowalne przez obiekty funkcyjne i adaptory Nie intuicyjne (eufemizm)

Algorytmy STL Przykład: algo1.cpp min_element // operator<() max_element // operator<() sort // operator<() find // operator==() reverse // operator=() min_element (coll.begin(), coll.end()) Zakres to [ coll.begin(), coll.end() ) (przykład: find1.cpp) Właściwa definicja zakresu to zadanie programisty Koniec zakresu powinien być osiągany przez ++’owanie początku Co gdy nie mamy pewności co jest końcem a co początkiem?

Algorytmy STL copy (coll1.begin(), coll1.end(), coll2.begin()); Koniec zakresu podany tylko dla pierwszego zakresu Rozmiar zakresu docelowego musi być wystarczający Algorytm przeprowadza wyłącznie proste nadpisywanie … bez sprawdzania rozmiaru zakresu docelowego (iteratory to interfejs do elementów kontenera, nie do kontenera) Właściwy rozmiar kolekcji to odpowiedzialność/zadanie programisty (przykład: copy2.cpp) Dla niektórych kontenerów (sekwencyjne) ustawienie rozmiaru początkowego jest proste

Iteratory STL Wielkość zakresu musi być wystarczająca, albo ... copy (coll1.begin(), coll1.end(), inserter(coll2, coll2.begin()) ); ... albo użyj iteratorów wstawiających (inserter) ;) (copy3.cpp) inserter dla wszystkich kontenerów, które mają metodę insert() Wstawia przed podaną lokalizacją Dla kontenerów asocjacyjnych lokalizacja jest tylko wskazówką back_inserter dla kontenerów, które mają metodę push_back() front_inserter dla kontenerów, które mają metodę push_front()

Iteratory STL Iteratory strumieniowe Zachowują się jak zwyczajne iteratory Mają interfejs zwykłych iteratorów Operują na strumieniach i/o (ioiter1.cpp) istream_iterator<string>(cin) ++iter dla stream>>temp, *iter aby pobrać temp istream_iterator<string>() Iterator końca srtumienia (zakresu strumienia)

Iteratory STL Iteratory odwrotne (reverse iterator) Mają interfejs zwykłych iteratorów Zachowują się odwrotnie (rter1.cpp) container.rbegin() wskazuje na ostatni element (nie pozycję po ostatnim) container.rend() wskazuje na pozycję przed pierwszym! ++ to --, -- to ++, itd.

Algorytmy STL Usuwanie elementów z kontenera Algorytm remove(...) Tak naprawdę nie usuwa zawartości kontenera (remove1.cpp) Nie ma dostępu do kontenera, a tylko do elementów Nie działa dla kontenerów asocjacyjnych Zwraca nowy koniec zakresu (element następny po ostatnim) Użyj metody kontener.erase(...) by się pozbyć elementów (remove2.cpp) Wiele wersji Działa dla kontenerów asocjacyjnych (remove3.cpp)

Rozszerzanie STL Programista może (a nawet powinien) rozszerzać funkcjonalność STL Tworzyć nowe wzorce, lub klasy/funkcje przykład: print.hpp Słowo kluczowe typename oznacza że argument jest typem W przeciwieństwie do „mutable” to jest użyteczne

Funkcja jako argument algorytmu Funkcje jednoargumentowe przykłady: foreach1.cpp, transform1.cpp Predykaty Jeden argument i wynik bool (przykład: prime1.cpp) Dwa argumenty i wynik bool (przykład: sort1.cpp)

Obiekt funkcyjny jako argument algorytmu Obiekty funkcyjne Zachowują się jak funkcje, ale wykorzystują operator()() foreach2.cpp Są obiektami Lepiej optymalizowane przez kompilator Mogą posiadać zmienne klasowe, „wewnętrzny stan” przekazany jako argument konstruktora (add1.cpp) Można mieć wiele obiektów funkcyjnych tej samej klasy

Obiekt funkcyjny jako argument algorytmu Predefiniowane szablony obiektów funkcyjnych less<>, greater <> set<int> s; domyślnie oznacza set<int, less<int> > s; można również: set<int, greater<int> > s; negate<>, multiply<> // do użycia w algorytmie transform(...)

Adaptory funkcji Definiują przypadki szczególne użycia funkcji Modyfikują funkcję, gdy wymagany jest inny interfeja (i.e. lista argumentów) bind2nd(less<int>(),50) (fo1.cpp) Tworzymy domyślny drugi argument

Elementy kontenerów Interfejs zawsze wymagany Konstruktor kopiujący Operator przypisania Destruktor Interfejs wymagany czasami Konstruktor domyślny operator == operator <

STL, błędy i wyjątki Zaprojektowana dla maksymalizacji prędkości W przypadku błędnego użycia (np. *end()=something) zachowanie jest niezdefiniowane, miejmy nadzieją że błąd ujawni się wcześnie Ostrożnie z iteratorami i zakresami Tylko minimalne sprawdzenia są realizowane (wyjątek bad_alloc) Jest wersja debug biblioteki Użyj jej!!! Niektóre metody niektórych kontenerów są „transaction-safe” A niektóre nie są! Sprawdź w dokumentacji!