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

Podobne dokumenty
Programowanie i struktury danych

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

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

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

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

Zaawansowane programowanie w języku C++ Biblioteka standardowa

Algorytmy w C++ dla opornych!

STL Standardt Template Library (wprowadzenie)

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

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.

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

Struktury Danych i Złożoność Obliczeniowa

Algorytmy i Struktury Danych.

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

Programowanie Obiektowew języku C++ Zadania L2

Kompletna dokumentacja kontenera C++ vector w -

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

Programowanie Komponentowe Zarządzanie obiektami: kontenery

Programowanie Obiektowew języku C++ Zadania L4

Kurs programowania. Wykład 9. Wojciech Macyna

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

Programowanie Obiektowew języku C++ Zadania L4

Biblioteka standardowa C++

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

STL Standard Template Library

Szablony funkcji i klas (templates)

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

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

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

Stos LIFO Last In First Out

Algorytmy i Struktury Danych

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

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

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

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

Struktury danych: stos, kolejka, lista, drzewo

Projektowanie klas c.d. Projektowanie klas przykład

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

Podstawy programowania w języku C++ Zadania

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++

Język C++ wykład VIII

Programowanie w języku Java. Kolekcje

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

Podstawy programowania w języku C++ Zadania - dziedziczenie i polimorfizm

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

Algorytmy, iteratory, kolekcje niestandardowe

Szablony funkcji i szablony klas

Programowanie Obiektowew języku C++ Zadania L8

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

Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04

Wykład 3. Złożoność i realizowalność algorytmów Elementarne struktury danych: stosy, kolejki, listy

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

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

Operatory na rzecz typu TString

Wprowadzenie do szablonów szablony funkcji

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

Programowanie Obiektowew języku C++ Zadania L2

Java Collections Framework

Algorytmy i Struktury Danych. Anna Paszyńska

WSTĘP DO INFORMATYKI. Struktury liniowe

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

Wprowadzenie do szablonów szablony funkcji

Paradygmaty programowania

Wstęp do programowania

Wykład 3 Składnia języka C# (cz. 2)

Język ludzki kod maszynowy

Programowanie Obiektowew języku C++ Zadania L9

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

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

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

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

Programowanie w języku C++

Szablony klas, zastosowanie szablonów w programach

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

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

Jak Windows zarządza pamięcią?

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

java.util.* :Kolekcje Tomasz Borzyszkowski

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

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

Rekurencja. Przygotowała: Agnieszka Reiter

Rekurencja. Dla rozwiązania danego problemu, algorytm wywołuje sam siebie przy rozwiązywaniu podobnych podproblemów. Przykład: silnia: n! = n(n-1)!

Ćwiczenia IV - Kontenery (pojemniki)

Programowanie Obiektowo Zorientowane w języku C++ Klasy, pola, metody

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

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

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

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

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2014/2015. Drzewa BST c.d., równoważenie drzew, kopce.

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

Programowanie proceduralne w języku C++ Pętle, tablice

Listy powiązane zorientowane obiektowo

prowadzący dr ADRIAN HORZYK /~horzyk tel.: Konsultacje paw. D-13/325

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Tablice. Monika Wrzosek (IM UG) Podstawy Programowania 96 / 119

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

Kolejka priorytetowa. Często rozważa się kolejki priorytetowe, w których poszukuje się elementu minimalnego zamiast maksymalnego.

Transkrypt:

Programowanie Obiektowo Zorientowane w języku C++ Biblioteka STL Mirosław Głowacki 1 1 Akademia Górniczo-Hutnicza im. Stanisława Staszica w Ktrakowie Wydział Inżynierii Metali i Informatyki Stosowanej Katedra Informatyki Stosowanej i Modelowania Maj 2019 Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 1 / 35

Spis treści 1 Biblioteka STL 2 Kontenery 3 Iteratory 4 Algorytmy 5 Podsumowanie Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 2 / 35

Spis treści 1 Biblioteka STL 2 Kontenery 3 Iteratory 4 Algorytmy 5 Podsumowanie Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 3 / 35

Biblioteka STL STL, czyli Standard Template Library, to biblioteka języka C++ zawierająca szablony gotowych do użycia: kontenerów, iteratorów, algorytmów oraz innych konstrukcji w formie szablonów. STL początkowo powstawała jako niezależna biblioteka rozwijana przez firmę Hewlett Packard. Z czasem większość przyjętych tam rozwiązań przeszła do biblioteki standardowej C++. STL to tzw. biblioteka generyczna - jej komponenty są sparametryzowane - niemal każdy z nich jest szablonem. Umożliwia to dobrą współpracę z typami wbudowanymi: w język i w bibliotekę oraz typami zdefiniowanymi przez użytkownika. Typy zdefiniowane muszą spełnić pewne określone warunki. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 4 / 35

Spis treści 1 Biblioteka STL 2 Kontenery 3 Iteratory 4 Algorytmy 5 Podsumowanie Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 5 / 35

Kontenery Biblioteka kontenerów pozwala programistom w łatwy sposób zaimplementować podstawowe struktury danych, jak kolejki, listy, stosy. Obecnie występują trzy rodzaje kontenerów: kontenery sekwencyjne, kontenery asocjacyjne i nieuporządkowane kontenery asocjacyjne (występują dopiero w standardzie C++11 ). Każdy z nich został zaprojektowany, aby zapewniać inny zestaw operacji. Zarządzają one pamięcią alokowaną dla ich elementów, i zapewniają metody dostępu: bezpośredniego lub przez iteratory, czyli obiekty o właściwościach podobnych do wskaźników. Większość kontenerów ma co najmniej kilka wspólnych funkcji wpływających ich funkcjonalność i wydajność. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 6 / 35

Kontenery sekwencyjne standardu C++03 Wszystkie kontenery sekwencyjne są szablonami klas, które implementują struktury danych, które zapewniają sekwencyjny dostęp do ich elementów. Biblioteka STL standard C++03 zawierała następujące kontenery sekwencyjne: vector stanowiący dynamiczną, ciągłą tablicę, deque będący dwustronnie zakończoną kolejką, list implementujący listę dwukierunkową. Standard C++11 wprowadził dwa dodatkowe kontenery sekwencyjne, a mianowicie: statyczną tablicę ciągłą array i listę jednokierunkową forward list. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 7 / 35

Kontenery asocjacyjne Kontenery asocjacyjne implementują posortowane struktury danych, które da się szybko przeszukiwać ze złożonością obliczeniową O(log n). Wyróżniamy następujące kontenery asocjacyjne, które są również szablonami klas: set - kolekcja unikalnych kluczy, posortowana względem tych kluczy. map, czyli słownik - jest to kolekcja par klucz-wartość, posortowana względem kluczy, które są unikalne. multiset - posortowana kolekcja kluczy, które mogą się powtarzać. multimap - słownik z powtórzeniami będący kolekcją par klucz-wartość, posortowana względem kluczy, które nie muszą być unikalne. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 8 / 35

Adaptery kontenerów STL zawiera dodatkowo klasy tzw. adapterów kontenerów, które zapewniają inny interfejs kontenerom sekwencyjnym, umożliwiając inny zakres operacji. Są to: stack, który adaptuje kontener w celu zapewnienia stosu o strukturze danych LIFO, queue, który adaptuje kontener w celu zapewnienia kolejki - struktura danych FIFO, priority queue, który adaptuje kontener w celu zapewnienia kolejki priorytetowej. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 9 / 35

Kontenery Tak więc kontenery, czyli obiekty zbiorcze są jedną z najważniejszych rzeczy wprowadzanych przez STL Ich rodzaje - różnią się konstrukcją i tym samym wydajnością poszczególnych operacji. Przykładowo kontener typu vector trzyma obiekty w liniowym obszarze pamięci, co umożliwia swobodny dostęp (ang. random access) do wszystkich elementów. Można go indeksować liczbą całkowitą, podobnie jak robi to się ze zwykłymi tablicami. Wstawienie nowego elementu gdziekolwiek indziej, niż na końcu jest operacją o złożoności liniowej, gdyż trzeba odsuwać elementy, żeby zrobić miejsce na nowy. Z kolei, w kontenerze typu list, wstawianie i usuwanie elementów jest operacją o stałym czasie wykonania, ale nie jest możliwe jego indeksowanie. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 10 / 35

Kontener vector - przykład W celu użycia pojemnika vector należ przyłączyć plik nagłówkowy o tej samej nazwie, a następnie zadeklarować wektor zawierający obiekty żądanej klasy jedną z instrukcji, np.: vector<string> mojwekt; vector<string> mojwekt(5); vector<string> mojwekt(5, "pusty"); Zostanę zarezerwowane kolejno: pusty wektor, wektor o rozmiarze 5, wektor o rozmiarze 5 wypełniony obiektami typu string. Obiekty wektora można indeksować: np. mojwekt[i] lub mojwekt.at(2). Można także wstawiać obiekty na końcu wektora mojwekt.push_back("ostatni"); Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 11 / 35

Kontener vector - przykład # include <string> # include <vector> using namespace std; int main(){ vector<string> mojwekt(4, "pusty"); mojwekt.push_back("ostatni"); vector<string>::iterator itstr = mojwekt.begin(); mojwekt.insert(itstr, "pierwszy"); itstr = mojwekt.end(); mojwekt.insert(itstr-=2, 2, "pelny"); mojwekt[2] = "trzeci"; for (size_t i = 0; i < mojwekt.size(); i++) cout << mojwekt[i] << " "; return 0; } pierwszy pusty trzeci pusty pelny pelny pusty ostatni Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 12 / 35

Kontenery Koncepcja kontenerów określa podstawowe warunki, jakie powinien spełniać typ, aby móc być zaliczonym do odpowiedniej kategorii i tym samym obsługiwanym przez odpowiednie składniki biblioteki. Określa też możliwości, jakie udostępnia dany kontener - np. list jest pojemnikiem dwukierunkowym, co oznacza, że można się po nim poruszać jedynie krokowo, ale za to w obu kierunkach. Natomiast vector jest zbiornikiem swobodnego dostępu i umożliwia poza tym jeszcze indeksowanie elementów wewnątrz pojemnika. Inny model z kolei prezentują sortowane pojemniki asocjacyjne, takie jak set i map. Elementy wewnątrz set i map są posortowane i wyszukiwanie elementu jest podobne do wyszukiwania binarnego o logarytmicznej złożoności czasowwej. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 13 / 35

Kontener map - przykład # include <iostream> # include <map> using namespace std; int main(){ map<int, string> tydzien; tydzien[1] = "niedziela"; tydzien[2] = "poniedziałek"; tydzien[3] = "wtorek"; tydzien[4] = "środa"; tydzien[5] = "czwartek"; tydzien[6] = "piątek"; tydzien[7] = "sobota"; cout << "3 dzień tygodnia to " << tydzien[3] << endl; } Trzeci dzień tygodnia to wtorek Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 14 / 35

Kontenery Kontener set jest zwykłym pojemnikiem asocjacyjnym i zawiera tylko elementy kluczowe (służy tylko do tego, żeby można było w nim łatwo dany element wyszukać) Natomiast map jest pojemnikiem asocjacyjnym zawierającym pary: klucz-wartość. Odrębnym zgadnieniem są wymagania dla typów użytkownika, których obiekty mają się znaleźć w kontenerze. Przykładowo przypisywalny oznacza, że obiekt ma mieć możliwość przypisania do niego wartości. Dla odmiany domyślnie konstruowalny oznacza, że typ musi posiadać konstruktor domyślny. Kontenery list i vector stawiają takie wymagania. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 15 / 35

Spis treści 1 Biblioteka STL 2 Kontenery 3 Iteratory 4 Algorytmy 5 Podsumowanie Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 16 / 35

Iteratory Wstawienie obiektu wewnątrz wektora (lub innego pojemnika) wymaga zastosowania iteratora: vector<string>::iterator itstr; Iteratory to specjalne obiekty przeznaczone do poruszania się po kontenerach. Iterator, podobnie jak inne elementy STL, musi podlegać określonej koncepcji. Koncepcję iteratora o swobodnym dostępie spełnia np. zwykły wskaźnik, gdyż można na nim wykonać operacje wymagane dla iteratora: ++, --, += czy -=. itstr = mojwekt.end(); mojwekt.insert(itstr-=2, 2, "pelny"); Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 17 / 35

Iterator mapy Zastosowanie iteratorów w stosunku do zaprezentowanej wcześniej mapy tydzien przedstawia następujący przykład. // definicja iteratora i ustawienie go // na element o kluczu 5 map<int, string>::iterator iter = tydzien.find(5); cout << "Dzień tygodnia nr " << iter->first << " to " << iter->second << endl; // elementy o kluczach większych i mniejszych map<int, string>::iterator poprzedni = iter; map<int, string>::iterator nastepny = iter; ++nastepny; --poprzedni; cout << "Przed nim jest " << poprzedni->second; cout << ", a po nim " << nastepny->second << endl; Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 18 / 35

Iterator listy A oto przykład zastosowania iteratora listy. # include <string> # include <list> int main (){ std::string bd = "brak_danych"; std::list<std::string> lista(5, bd); // dostep do elementow listy zapewnia iterator std::list<std::string>::iterator iter; // begin() ustawia iterator na początku listy // end() ustawia iterator za lista // operator++ inkrementuje iterator if(!lista.empty()) for (iter = lista.begin(); iter!= lista.end(); ++iter) std::cout << *iter << " "; std::cout << std::endl; Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 19 / 35

Iterator listy lista.push_back("poniedziałek"); lista.push_back("wtorek"); lista.push_back("środa"); lista.push_back("czwartek"); lista.push_back("piątek"); lista.push_back("sobota"); lista.push_back("koniec-listy"); lista.push_front("niedziela"); lista.push_front("lista-dni-tygodnia:"); for (iter = lista.begin(); iter!= lista.end(); ) if ((*iter) == bd) iter=lista.erase(iter); else iter++; Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 20 / 35

Iterator listy if(!lista.empty()) for (iter = lista.begin(); iter!= lista.end(); ++iter){ std::cout << *iter << std::endl; // wartość elementu listy wyłuskuje // operator wyłuskania "*"" } return 0; } Rezultatem działani programu jest strumień wyjściowy: brak danych brak danych brak danych brak danych brak danych Lista-dni-tygodnia: niedziela poniedziałek wtorek środa czwartek piątek sobota Koniec-listy Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 21 / 35

Spis treści 1 Biblioteka STL 2 Kontenery 3 Iteratory 4 Algorytmy 5 Podsumowanie Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 22 / 35

Algorytmy STL definiuje się też algorytmy, czyli odpowiednie wzorce funkcji, które mają wykonać pewne abstrakcyjne zadania na określonym kontenerze. Przykładowym algorytmem jest for each, który ma wywołać podany funktor na określonym zakresie elementów. Innymi przykładami algorytmów są reverse, który odwraca kolejność elementów w kontenerze, find, który wyszukuje określoną wartość, czy find if, który wyszukuje element spełniający warunek określony podanym funktorem. Każdy algorytm STL może pracować na każdym pojemniku konkretyzowanym każdym możliwym typem. Nie każda jednak kombinacja algorytmu i kontenera ma sens - np. nie ma sensu wywoływać algorytmu sort na kontenerze takim jak set. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 23 / 35

Kontenery, iteratory, algorytmy - przykład # include <iostream> # include <set> # include <algorithm> using namespace std; struct Suma{ Suma(): suma(0) { } void operator()(double dbl){suma += dbl;} double suma; }; int main(){ set<double> liczby; for(int i = 1; i < 100; i++) liczby.insert(i); set<double>::iterator result, it; result = liczby.find(5); Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 24 / 35

Kontenery, iteratory, algorytmy - przykład } if(result!= liczby.end()) cout << "Znaleziona liczba: " << *result << endl; for(it = liczby.begin(); it!= result; ++it) cout << *it << " "; Suma s = for_each(liczby.begin(), result, Suma()); cout << endl << "Suma liczb wynosi: " << s.suma << endl; return 0; Znaleziona liczba: 5 1 2 3 4 Suma liczb wynosi: 10 Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 25 / 35

Grupy algorytmów Biblioteka <algorithm> ma dla języka C++ duże znaczenie. Algorytmy modyfikujące kontenery są uciążliwe i wymagają znacznego nakładu pracy. Biblioteka dostarcza ponad 60 funkcji, które tematycznie można zakwalifikować do następujących grup: Operacje niemodyfikujące - np. for_each wykonująca operację na każdym elemencie ciągu, czy count określająca liczbę wystąpień danej wartości w ciągu. Operacje niemodyfikujące, wyszukujące - np. find, która znajduje pierwsze wystąpienie wartości w ciągu, czy search znajdująca pierwsze wystąpienie podciągu w większym ciągu. Operacje modyfikujące - np. fill, która zastępuje elementy ciągu podaną wartością czy generate zastępująca elementy ciągu wartościami będącymi wynikiem funkcji. Operacje zmieniające kolejność - np. partition, która umieszcza elementy spełniające warunek przed tymi, które go nie spełniają. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 26 / 35

Grupy algorytmów Kolejne grupy tematyczne biblioteki <algorithm> : Operacje sortujące - np. sort, która sortuje ciąg rosnąco, czy stable_sort sortująca ciąg z zachowaniem wzajemnej kolejność dla równych elementów. Operacje wyszukiwania binarnego, np. lower_bound, która zwraca iterator do pierwszego elementu równego lub większego od podanego, czy binary_search stwierdzająca czy dany element występuje w ciągu. Operacje na zbiorze, np. merge łącząca dwa zbiory w zbiór posortowany, czy set_difference tworząca różnicę dwóch zbiorów. Operacje na kopcu, np. make_heap, która przekształca ciąg elementów tak aby tworzyły kopiec, czy sort_heap przekształcająca ciąg o strukturze kopca w ciąg posortowany. Operacje min max takie jak max, która zwraca większy z dwóch elementów, czy max_element wyszukująca największy z elementów ciągu. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 27 / 35

Grupy algorytmów Ostatnia z grup tematycznych algorytmów zawarta jest w oddzielnej bibliotece <numeric> : Operacje numeryczne, np. accumulate sumująca ciąg elementów, czy inner_product, która oblicza iloczyn skalarny na elementach dwóch ciągów. # include <iostream> # include <numeric> # include <vector> int main(){ std::vector<double> a{0., 1., 2., 0.,-1.}; std::vector<double> b{5., 1., 0., 3., 1.}; double ilo = std::inner_product(a.begin(), a.end(), b.begin(), 0); // 0 - wartość początkowa iloczynu if (!ilo) std::cout << "Wektory są ortogonalne\n"; } Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 28 / 35

Przykład - zmiana struktury wektora Ostatni z przykładów przedstawia funkcje operujące na kopcu - dla przypomnienia: Kopiec (ang. heap) inne nazwy: stóg lub sterta to struktura danych oparta na drzewie, w której wartości potomków węzła są w stałej relacji z wartością rodzica. Jeżeli kopiec ma być kopcem zupełnym, wtedy dodatkowo spełnione muszą być warunki: drzewo jest prawie pełne, tzn. liście występują na ostatnim i ewentualnie przedostatnim poziomie w drzewie tylko gdy ostatni poziom nie jest całkowicie wypełniony, liście na ostatnim poziomie są spójnie ułożone od strony lewej do prawej. Jeśli przyjętą relacją między wartością potomka a wartością rodzica będzie relacja mniejszości, wówczas na szczycie znajdzie się węzeł z największym kluczem. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 29 / 35

Przykład - zmiana struktury wektora W przypadku zupełnego kopca binarnego, łatwo zaimplementować kopiec w tablicy, według schematu: Numerując kolejne elementy począwszy od korzenia kopca ( 1 ), a następnie od lewej do prawej, na każdym kolejnym poziomie kopca można łatwo uzyskać dostęp do potomka lewego lub prawego, albo rodzica: Jeśli potomek ma numer n, to rodzic ma n/2 - np. dla węzła 7 rodzic ma numer 3, Jeśli rodzic ma numer n, to lewy potomek ma numer 2n, a prawy 2n+1. Dla innych kopców istnieją podobne techniki. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 30 / 35

Przykład - zmiana struktury wektora # include <iostream> # include <algorithm> # include <vector> using namespace std; void vectelem(const char& val) {cout << val << " "; } void heapelem(const char& val){ static unsigned int nrwez = 1; static unsigned int nrpoz = 1; if (nrwez++ == nrpoz) nrpoz *= 2; cout << val << " "; if (nrwez == nrpoz) cout << endl; } void wypiszdane(const vector<char>::iterator& itp, const vector<char>::iterator& itk){ Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 31 / 35

Zmiana struktury wektora - przykład if (is_heap(itp, itk)) for_each(itp, itk, heapelem); else for_each(itp, itk, vectelem); cout << endl; } int main(){ char alfabet[] = {"abcdefghijklmnoprstuvwxyz"}; unsigned int chrno = sizeof(alfabet); vector<char> cvect; for (int i = 0; i < chrno; i++) cvect.push_back(alfabet[i]); vector<char>::iterator itp = cvect.begin(), itk = cvect.end(); wypiszdane(itp, itk); std::reverse(itp, itk); wypiszdane(itp, itk); Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 32 / 35

Zmiana struktury wektora - przykład } make_heap(itp, itk); // utworzenie kopca wypiszdane(itp, itk); sort_heap(itp, itk); // przywrócenie struktury wypiszdane(itp, itk); return 0; a b c d e f g h i j k l m n o p r s t u v w x y z z y x w v u t s r p o n m l k j i h g f e d c b a z x y t w v u k s r p o n m l j i h g f e d c b a a b c d e f g h i j k l m n o p r s t u v w x y z Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 33 / 35

Spis treści 1 Biblioteka STL 2 Kontenery 3 Iteratory 4 Algorytmy 5 Podsumowanie Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 34 / 35

Biblioteka STL - podsumowanie Sposób zaprogramowania biblioteki STL (jej generyczność) zapewnił jej szerokie zastosowanie - kontenery, iteratory i algorytmy mogą się ona adaptować do typów nieznanych w momencie jej opracowywania. Szablony C++ są bardzo efektywne, więc STL jest o wiele bardziej popularna niż podobne biblioteki pisane dla C, w przypadku których wydajność była istotnie niższa od ręcznie programowanych rozwiązań. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2019 35 / 35