Paweł Rzechonek

Zainteresowania zawodowe: programowanie (C++, Java, C#, F#), technologie webowe, szeroko rozumiana algorytmika, metematyka klasyczna.

C++17 i STL
kurs zaawansowany

data ostatniej modyfikacji

Data ostatniej modyfikacji dokumentu (cpp.phtml) to piątek 17 stycznia 2020 roku (o godzinie 23:00).

ogłoszenia
1 października 2019 r.
pierwsze laboratoria:
W pierwszym tygodniu nauki laboratoria nie odbywają się. Pierwsze zajęcia laboratoryjne odbędą się w przyszłym tygodniu: 10-11 października 2019 r.

1 października 2019 r.
punkt informacyjny:
W tym miejscu będą się pojawiać ważne ogłoszenia dotyczące organizacji wszystkich zajęć związanych z tym przedmiotem. Proszę czytać te ogłosznia na bieżąco.
terminarz
wykład:
czwartek 18-19 s.139 (Paweł Rzechonek)

laboratoria:
czwartek 16-18 s.107 (Paweł Rzechonek)
piątek 10-12 s.7 (Marek Szykuła)
licznik wejść na stronę

1 dzisiaj
4 w obecnym miesiącu
19 w bieżącym roku
3006 od powstania strony

o przedmiocie

Kurs C++17 i STL

C++17 to najnowsza wersja języka C++. Język C++ prawdza się, gdy chcemy zapewnić wysoką wydajność programu. Język ten jest stale rozwijany a kolejne jego specyfikacje, czyli C++11, C++14 i C++17, przyniosły wiele udogodnień. Aby w pełni wykorzystać potencjał języka C++ należy go używać wraz z biblioteką standardową STL. C++ wraz z STL to doskonałe narzędzie do implementowania oprogramowania wysokiej jakości.

Wymagane przygotowanie
  •   Umiejętność programowania obiektowego w języku C++98.
  •   Podstawowa znajomość algorytmiki.
  •   Umiejętność czytania dokumentacji technicznej w języku angielskim.
Cel kursu
  •   Nauka programowania w języku C++17.
  •   Poznanie obszernych fragmentów biblioteki standardowej STL.

literatura

Podrędznik podstawowy
  •   N.M.Josuttis: C++. Biblioteka standardowa. Podręcznik programisty. Wydanie 2. Wydawnictwo Helion, Gliwice 2014.
Literatura papierowa
  •   B.Stroustrup: Język C++. Kompendium wiedzy. Wydanie 4. Wydawnictwo Helion, Gliwice 2014.
  •   J.Galowicz: C++17 STL. Receptury. Wydawnictwo Helion, Gliwice 2018.
Literatura elektroniczna

laboratorium

Zasady zaliczenia przedmiotu
Ogólnie:
W semestrze będzie opublikowanych (na tej stronie) kilkanaście prostych list z zadaniami do zaprogramowania. Za każde samodzielnie zaprogramowane zadanie/zadania i oddane w terminie można będzie dostać do 10 punktów.
Terminy:
Zadania do zaprogramowania będą ogłaszane w tygodniu poprzedzającym termin ich realizacji. Zadania należy oddawać w wyznaczonym terminie. Spóźnienia nie będą tolerowane, za wyjątkiem uzasadnionych sytuacji życiowych: choroba potwierdzona zwolnieniem lekarskim, wezwanie do Sądu, itp.
Prezentacje:
Programy należy prezentować osobiście w czasie pracowni (proszę nie wysyłać programów pocztą elektroniczną, ani nie przekazywać ich poprzez innych studentów). W trakcie prezentacji programu trzeba się liczyć z pytamiami dotyczącymi zadania: metoda rozwiązania, zastosowane konstrukcje językowe, wykorzystane technologie, itp.
Rozwiązania:
Kody źródłowe własnych programów należy zapisywać na SKOS, ponieważ tylko wtedy rozwiązania zadań będą podlegały weryfikacji autorskiej i ocenie.
Oceny:
Aby zaliczyć laboratorium na ocenę dostateczną trzeba do końca semestru zdobyć 50% z wszystkich możliwych do uzyskania punktów; na ocenę bardzo dobrą trzeba będzie zgromadzić 90% punktów; oceny pośrednie pozostją w liniowej zależności od przedstawionych wymagań granicznych.
Zadania laboratoryjne
  1. 10, 11 października 2019: nowe elementy języka C++
  2. Zadanie 1 (1 pkt).
    Sprawdź, czy w nowym kompilatorze (co najmniej c++17) działają trójznaki (ang. trigraphs) takie jak ??- co tłumaczy się na znak tyldy ˜, itp.). Co zrobić, aby nowy kompilator właściwie zinterpretował występujące w programie trójznaki?
    Zadanie 2 (1 pkt).
    Wypisz na standardowym wyjściu std::out surowy łańcuch znaków (ang. raw string) zawierający różne sekwencje znaków cudzysłowia i nawiasów okrągłych (a w szczególności sekwencję )").
    Zadanie 3 (2 pkt).
    Stwórz alias dla typu będącego zbiorem std::set<> łańcuchów znakowych. Następnie zadeklaruj i zainicjalizuj taki zbiór używając jednolitej inicjalizacji. Na koniec przejdź po tym zbiorze pętlą for dla zakresów (ang. range-based for loop)) dedukując automatycznie typ elementów zbioru; wypisz w pętli wszystkie łańcuchy na standardowym wyjściu std::out).
    Zadanie 4 (2 pkt).
    Zdefiniuj silnie stypizowany typ wyliczeniowy dla kilku wybranych imion męskich i żeńskich, którego elementy będa typu uint_16. Następnie zdefiniuj funkcję, która jako argumenty przyjmuje komunikat typu string i imię odbiorcy typu wyliczeniowego (funkcja może wypisywać komunikat personalnie skierowany do wskazanej osoby używając instrukcji switch-case).
    Zadanie 5 (2 pkt).
    Zdefiniuj funkcję rekurencyjną, która będzie wyznaczała n-tą liczbę Lucasa. Funkcja ta ma przyjmować argument typu uint32_t, i która będzie automatycznie dedukować typ wyniku.
    Zadanie 6 (2 pkt).
    napisz program, który dla podanych współczynników równania kwadratowego wyliczy wyróżnik tego równania (często oznaczany symbolem Δ) i w zależności od jego wartości wypisze miejsca zerowe. Użyj do tego celu instrukcji warunkowej z lokalnym inicjalizatorem dla wyróżnika.
  3. 17, 18 października 2019: sprytne wskaźniki
  4. Zadanie 1 (5 pkt).
    Zdefiniuj prostą klasę zawierającą licznik typu uint64_t, początkowo ustawiony na wartość 1. W kasie tej, oprócz innych funkcjonalności, umieść wirtualny destruktor, który wypisze komunikat ze stanem licznika na standardowym wyjściu dla błędów.
    Następnie stwórz n-elementową tablicę takich liczników i opakuj ją wskaźnikiem unique_ptr.
    Napisz też funkcję, która wywoła się rekurencyjnie m razy ze wskaźnikiem na taką tablicą (wskaźnik unique_ptr przekaż przez wartość). W i-tym wywołaniu funkcja ta ma losowo wybrane elementy przemnożyć przez i-tą z kolei liczbę pierwszą.
    Na koniec wywołaj tą funkcję, a po jej wywołaniu wypisz wartości wszystkich n liczników w tablicy. Parametry n i m możesz ustalić arbitralnie.
    Zadanie 2 (4 pkt).
    Zdefiniuj klasę opakowującą plik tekstowy line_writer. Obiekt takiej klasy ma przetrzymywać wskaźnik/referencję do strumienia plikowego ofstream. Zadaniem obiektów tej klasy będzie pisanie do pliku wiersz po wierszu. Czy klasa ta powinna zamykać strumień w destruktorze?
    Dalej w programie głównym stwórz kilka wskaźników shared_ptr odnoszących się do tego samego obiektu plikowego. Niech każdy fragment programu posiadający taki własny wskaźnik zapisze w tym pliku swoje dane. Plik powinien zostać zamknięty dopiero, gdy wszystkie sprytne wskaźniki zostaną zlikwidowane.
    Zadanie 3 (1 pkt).
    Przetestuj, kiedy wskaźnik weak_ptr będzie wskazywać na obiekt w pamięci, a kiedy stanie się wskaźnikiem wiszącym (po zwolnieniu zasobu przez wskaźnik macierzysty shared_ptr).
  5. 24, 25 października 2019: czasomierze
  6. Zadanie 1 (1 pkt).
    Wypisz najmniejszą i największą wartość jaką można zapisać w typie long long int. Na ilu bitach jest ta liczba zapisywana i ile to będzie cyfr dziesiętnych?
    Zadanie 2 (1 pkt).
    Jaka jest najbliższa 0 liczba dodatnia i liczba ujemna dla typów float i double? Jakie są maksymalne wartości zapisywane w tych typach? Jaka jest różnica pomiędzy 1 a najmniejszą liczbą ≤1 w tych typach?
    Zadanie 3 (2 pkt).
    Zdefiniuj początkowe liczby harmoniczne posługując się statyczną arytmetyką liczb wymiernych z wykorzystaniem szablonu ratio. Jaką największą liczbę harmoniczną udało Ci się zdefiniować?
    Zadanie 4 (3 pkt).
    Zdefinuj szablon funkcji, które przeniesie wartość ze wskazanego obiektu do innego obiektu. Uwzględnij dwa aspekty: po pierwsze obiekt źródłowy może być zadany przez wartość/referencję albo przez wskaźnik (rozróżnij te dwa przypadki za pomocą cechy typowej is_pointer), a po drugie obiekt docelowy ma być wskazany przez referencję niekoniecznie tego samego typu (ustal możliwość konwersji za pomocą cechy typowej is_convertible)
    Zadanie 5 (3 pkt).
    Stwórz macierze o rozmiarach odpowiednio 10×10, 100×100, 1000×1000 i 10000×10000 i wypełnij je losowymi wartościami z zakrsu od 0.5 do 2.0. Następnie podnieś do kwadratu każdą z tych macierzy mierząc czas wykonania tych operacji za pomocą obiektu duration. Dla małych macierzy powtórz operację wielokrotnie a potem zmierzony czas podziel przez tą wielokrotność. Do pomiaru czasu użyj czasomierzy opartych na zegarze high_resolution_clock.
  7. 14, 15 listopada 2019: funktory
  8. Stwórz w swoim programie trzy zbiory danych różnego typu vector<double>, list<string> i set<int>. Wypełnij te kontenery przypadkowymi wartościami (możesz losować albo arbitralnie coś wpisać). Następnie na zbiorach tych wykonaj pewne obliczenia z użyciem zdefiniowanych przez ciebie funktorów (obiekty funkcyjne albo lambdy):

    Zadanie 1 (1 pkt).
    Wypisz wszystkie wartości z zadanego zakresu (większe od a i mniejsze od b).
    Zadanie 2 (1 pkt).
    Wypisz co k-tą wartość zaczynając od pozycji p-tej.
    Zadanie 3 (1 pkt).
    Wyznacz średnią arytmetyczną (dotyczy kolekcji z liczbami).
    Zadanie 4 (1 pkt).
    Wyznacz element minimalny i maksymalny (zwróć parę iteratorów).
    Zadanie 5 (1 pkt).
    Wyznacz sumę/konkatenację wszystkich elementów.
  9. 21, 22 listopada 2019: kolekcje
  10. Zadanie 1 (6 pkt).
    Zaprogramuj algorytm stacji rozrządowej Dijkstry, który przekształca wyrażenie arytmetyczne z postaci infiksowej z nawiasami do postaci postfiksowej bez nawiasów (Odwrotna Notacja Polska). Wykorzystaj do tego celu kolekcje standardowe.
    W swoim algorytmie najpierw podziel wejściowe wyrażenie arytmetyczne na kolejkę/listę leksemów. Wynikiem działania procedury przekształcającej ma być kolejka/lista symboli.
    Zadanie 2 (9 pkt).
    Zaprogramuj strukturę danych do przetrzymywania ważonego grafu dynamicznego w postaci list sąsiadów. Wspomniana dynamiczność oznacza, że można dodawać nowe a także usuwać istniejące wierzchołki w grafie. Co się tyczy krawędzi, krawędzie można dodawać i usuwać, a także zmieniać ich wagę. Wykorzystaj do tego celu kolekcje standardowe.
    Każdy wierzchołek grafu niech oprócz kolejnego numeru będzie miał przypisaną nazwę. Do wierzchołków grafu chcielibyśmy odwoływać się zarówno poprzez jego numer jak i nazwę.
    Zaprogramuj też w grafie algorytm sprawdzania czy istnieje ścieżka pomiędzy zadanymi wierzchołkami.
  11. 21, 22 listopada 2019: liczby pseudolosowe
  12. Zadanie 1 (2 pkt).
    Zdefiniuj szablon funkcji, który losowo spermutuje zadaną tablicę obiektów. Każda permutacja ma być jednakowo prawdopodobna.
    Zadanie 2 (3 pkt).
    Napisz program, który wygeneruje 1000 losowych liczb z rozkładem:
    1. jednostajnym, używając uniform_real_distribution;
    2. dwumianowym, używając binomial_distribution;
    3. normalnym, używając normal_distribution.
    Wygenerowane liczby zapisz w pliku .csv (dla każdego rozkładu w osobnym pliku). Zrób w arkuszu kalkulacyjnym wykresy dla danych wygenerowanych w taki sposób, aby sprawdzić poprawność zastosowanego rozkładu prawdopodobieństwa.
    Z formatem pliku CSV można się zapoznać na przykład na Wikipedii:
        https://pl.wikipedia.org/wiki/CSV_(format_pliku)
        https://en.wikipedia.org/wiki/Comma-separated_values
  13. 28, 29 listopada 2019: liczby zespolone
  14. Zadanie 1 (2 pkt).
    Zdefiniuj funkcje pracujące na liczbach zespolonych, które będą wyliczać wartość:
    1. funkcji gamma Eulera $\Gamma(z) = \frac{1}{z} \prod_{n=1}^{\infty} \frac{(1+\frac{1}{n})^z}{1+\frac{z}{n}}$
    2. i odwrotności tej funkcji $\frac{1}{\Gamma(z)} = ze^{\gamma z} \prod_{n=1}^{\infty} \left(\left(1+\frac{z}{n}\right)e^{-\frac{z}{n}}\right)$.
    Symbol $\gamma$ reprezentuje stałą Eulera-Mascheroniego wynoszącą około 0.5772156649. Funkcje te mają liczyć wartość funkcji w zadanym punkcie zespolonym z określoną dokładnością (liczba iteracji).
    Zadanie 2 (3 pkt).
    Zdefiniuj funkcję pracującą na liczbach zespolonych, które będą wyliczać wartość funkcji dzeta Riemanna $\zeta(z) = \sum_{n = 1}^{\infty} \left(\frac{1}{n}\right)^z$. Szereg ten jest zbieżny dla takich $z$, których część rzeczywista jest $>1$. Funkcja ta ma liczyć wartość funkcji w zadanym punkcie zespolonym z określoną dokładnością (liczba iteracji).
    Policz i stablicuj wartości tej funkcji na prostej krytycznej $\Re(z) = 0.5$ z hipotezy Riemanna. Wygenerowane liczby zapisz w pliku .csv (w osobnych kolumnach części rzeczywiste i urojone). Następnie zrób w arkuszu kalkulacyjnym podwójny wykres dla danych wygenerowanych w taki sposób (nałożone na siebie wykresy dla części rzeczywistych i urojonych).
    Z formatem pliku CSV można się zapoznać na przykład na Wikipedii:
        https://pl.wikipedia.org/wiki/CSV_(format_pliku)
        https://en.wikipedia.org/wiki/Comma-separated_values
  15. 12, 13 grudnia 2019: wyrażenia regularne
  16. Zadanie 1 (2 pkt).
    Zdefiniuj wyrażenie regularne do rozpoznawania prawidłowo zapisanej godziny. Zapis godziny to liczba godzin (0-23) i liczba minut (0-59) oddzielone dwukropkiem (obydwie liczby zapisane za pomoca dwóch cyfr); opcjonalnie w godzinie mogą sie pojawić sekundy (0-59).
    Przetestuj wyrażenie na danych wprowadzonych ze standardowego wejścia.
    Zadanie 2 (3 pkt).
    Zdefiniuj wyrażenie regularne do rozpoznawania prawidłowo zapisanej daty. Zapis daty składa się z numeru dnia w miesiącu (1-31), numeru miesiąca(1-12) i roku; liczby te mają być od siebie oddzielone minusem (numer dnia i miesiąca zapisane za pomoca dwóch cyfr a rok za pomocą co najmniej czterech). Zadbaj o sprawdzanie górnych ograniczeń na liczbę dni w poszczególnych miesiącach (ale nie sprawdzaj już przestępności roku).
    Przetestuj wyrażenie na danych wprowadzonych ze standardowego wejścia.
    Zadanie 3 (3 pkt).
    Zdefiniuj wyrażenie regularne do rozpoznawania prawidłowo zapisanej nazwy miejscowości w Polsce. Zapis nazwy miejscowości to ciąg słów, gdzie każde słowo jest co najmniej trzyliterowe i rozpoczyna się z dużej litery. Poszczególne słowa mogą być odseparowane dowolną liczbą spacji; istnieją też połączenia słów za pomocą łącznika (ale nie więcej niż dwa słowa mogą być tak połączone).
    Przetestuj wyrażenie na danych wprowadzonych ze standardowego wejścia.
    Zadanie 4 (2 pkt).
    Zdefiniuj wyrażenie regularne do rozpoznawania prawidłowo zapisanej liczby zespolonej. Zapis liczby zespolonej składa się z dwóch liczb rzeczywistych (z opcjonalna możliwością wystąpienia części ułamkowej po kropce dziesiętnej) oddzielonych znakiem plusa, przy czym druga liczba jest zakończona małą albo dużą literą "i"; całość jest ujęta w nawiasy okrągłe. W okolicach nawiasów oraz plusa mogą się pojawić spacje.
    Przetestuj wyrażenie na danych wprowadzonych ze standardowego wejścia.
  17. 19, 20 grudnia 2019: iteratory strumieniowe i plikowe
  18. Zadanie 1 (2 pkt).
    Odczytaj ze standardowego wejścia jedną linię z danymi - ciąg liczb rzeczywistych pooddzielanych spacjami. Używając iteratora strumieniowego istream_iterator odczytaj te liczby, zapisz je w wektorze i wypisz na standardowym wyjściu w odwrotnej kolejności z dokładnością do 3 miejsc po kropce dziesiętnej.
    Zadanie 2 (2 pkt).
    Niech $\Phi(n)$ oznacza funkcję Eulera (tocjent), która dla każdej dodatniej liczby naturalnej zwraca liczbę liczb naturalnych nie większych od $n$ i względnie pierwszych z $n$. Dla zadanej wartości $k$ stablicuj kolejne wartości tocjenta $\Phi(1), \Phi(2), \ldots, \Phi(k)$ a następnie zapisz je do pliku phi.txt, używając iteratora strumieninowego ostream_iterator z separatorem w postaci średnika i spacji "; ".
    Zadanie 3 (2 pkt).
    Napisz program, który sprawdzi czy w lokalnym systemie plików istnieją podane pliki/katalogi a jeśli tak, to wypisze ich najważniejsze parametry (ścieżka kanoniczna, data utworzenia, rozmiar dla pliku, itp.). Nazwy plików i katalogów przekaż do programu poprzez argumenty wywołania.
    Zadanie 4 (2 pkt).
    Napisz program, który wypisze zawartoś wskazanego katalogu w lokalnym systemie plików. Jeśli podany przez użytkownika katalog nie istnieje, to wypisz taką informację. Wypisując zawartość katalogu posłuż się iteratorem katalogowym directory_iterator.
    Zadanie 5 (2 pkt).
    Napisz program, który policzy i wypisze sumę wielkości wszystkich plików we wskazanym katalogu i jego podkatalogach. Jeśli podany przez użytkownika katalog nie istnieje, to wypisz taką informację. Analizując zawartość katalogu posłuż się iteratorem katalogowym directory_iterator.
  19. 16, 17 stycznia 2020: algorytmy
  20. Zadanie 1 (2 pkt).
    Dane o pewnych osobach są zgromadzone w wektorze. Pojedyncza osoba jest opisana za pomocą nazwy (imię i nazwisko), wieku, wagi i wzrostu. Posortuj te dane według współczynnika BMI i wypisz je na standardowym wyjściu (funkja porównująca niech będzie lambdą). Wypisz także jaka osoba jest najstarsza, najcięższa oraz najwyższa.
    Zadanie 2 (2 pkt).
    Dane o kolorowych punktach na płaszczyźnie są zgromadzone w liście. Pojedynczy punkt jest opisany za pomocą współrzędnych, koloru w postaci RGB i nazwy. Podziel te punkty na takie, które leżą w I, II, III i IV ćwiartce. Wypisz także jaki punkt jest najjaśniejszy a jaki najciemniejszy.
  21. 16, 17 stycznia 2020: metaprogramowanie
  22. Zadanie 1 (2 pkt).
    Wykorzystując metaprogramowanie zdefiniuj szablon obiektu funkcyjnego, pozwalającego obliczyć na poziomie kompilacji n-tą liczbę Lucasa dla liczby naturalnej n ≥ 0. Funkcja powinna działać w liniowym czasie O(n).
    Zadanie 2 (2 pkt).
    Wykorzystując metaprogramowanie zdefiniuj szablon obiektu funkcyjnego, pozwalającego obliczyć na poziomie kompilacji współczynnik dwumianowy (nk) dla liczb naturalnych 0 ≤ k ≤ n. Funkcja powinna działać w liniowym czasie O(n).
    Zadanie 3 (2 pkt).
    Wykorzystując metaprogramowanie zdefiniuj szablon obiektu funkcyjnego, pozwalającego obliczyć na poziomie kompilacji największy wspólny dzielnik NWD(a, b) dla liczb naturalnych a, b ≥ 1 dla naturalnych liczb 0 ≤ k ≤ n. Funkcja powinna działać w logarytmicznym czasie O(log a + log b).
  23. 23, 24 stycznia 2020: współbieżność
  24. Zadanie 1 (10 pkt).

    Napisz program, który zilustruje problem czytelników i pisarzy z wykorzystaniem operacji czytania z i pisania do jednego pliku tekstowego.

    W swoim programie zdefiniuj klasy Czytelnik, Pisarz i Arbiter (pisarze i czytelnucy posiadają swoje unikatowe dwucyfrowe identyfikatory). Czytelnicy co pewien czas (określany na bieżąco w sposób losowy) czytają plik dane.txt i wyświetlają na standardowym wyjściu ostatnią zapisaną w pliku liczbę (poprzedzoną identyfikatorem czytelnika). Natomiast pisarze dopisują także co jakiś czas (określany na bieżąco w sposób losowy) do tego pliku losowe liczby naturalne (rozpoczynające się od identyfikatora pisarza). Z przyczyn oczywistych czytelnicy mogą działać jednocześnie, natomiast pisarze nie. Co więcej, działalność pisarza wyklucza w tym czasie także działalność czytelników. Rolą arbitra jest dopuszczanie w odpowiedni sposób czytelników i pisarzy do pliku dane.txt.

    Problem należy rozwiązać na różne sposoby:

    1. dopuszczając zagłodzenie pisarzy;
    2. dopuszczając zagłodzenie czytelników;
    3. nie dopuszczając do zagłodzenia ani czytelników ani pisarzy.
Ranking
  • grupa PRz, czwartek 18 (pdf) (hasło: stat)

wykłady

3 października 2019 r: nowe elementy języka w C++17

organizacja zajęć
nowe elementy języka C++ 11/14/17
  • trójznaki
  • surowe łańcuchy znakowe
  • pętla for-each
  • jednolita inicjalizacja
  • stypizowane typy wyliczeniowe
  • dedukcja typów za pomocą auto i decltype
  • instrukcje if i switch-case z częścią inicjalizującą zmienne lokalne dla tych instrukcji
  • instrukcja constexpr-if

slajdy: organizacja.pdf, nowe.pdf

C++ compiler support

Wandbox (C++2a compiler online)

10 października 2019 r: sprytne wskaźniki

sprytne wskaźniki
  • wskaźniki współdzielone shared_ptr
  • słabe wskaźniki weak_ptr
  • wskaźniki unikatowe unique_ptr

slajdy: wskazniki.pdf

17 października 2019 r: czasomierze

sprytne wskaźniki
  • limity liczbowe
  • cechy typowe
  • współczynniki ułamkowe ratio
  • zegary clock, punkty time_point i odcinki czasowe duration
  • czas w systemie POSIX

slajdy: czasomierze.pdf

24 października 2019 r: funktory

funktory
  • obiekty funkcyjne
  • lambdy

slajdy: funktory.pdf

7 listopada 2019 r: kolekcje standardowe

kolekcje standardowe
  • wartościowa semantyka kolekcji
  • elementy kolekcji
  • rodzaje kolekcji i ich implementacja
  • tablice
  • wektory i deki
  • listy dwukierunkowe i jednokierunkowe
  • zbiory i multizbiory
  • mapy i multimapy
  • zbiory i mapy z haszowaniem

slajdy: kolekcje.pdf

14 listopada 2019 r: generatory liczb pseudolosowych

generatory liczb pseudolosowych
  • mechanizmy losowości
  • rozkłady

slajdy: losowe.pdf

21 listopada 2019 r: liczby zespolone

liczby zespolone
  • szablon klasy complex<>
  • funkcje i operatory działające na liczbach zespolonych

28 listopada 2019 r: wyrażenia regularne

wyrażenia regularne
  • budowa wyrażeń regularnych
  • klasa regex
  • funkcje dopasowujące
  • podwyrażenia
  • iterowanie po dopasowaniach

slajdy: regularne.pdf

12 grudnia 2019 r: iteratory strumieniowe i plikowe

iteratory strumieniowe i plikowe
  • iterator strumieniowy wejściowy istream_iterator
  • iterator strumieniowy wyjściowy ostream_iterator
  • iteratory po systemie plików directory_iterator i recursive_directory_iterator
  • klasa std::filesystem::path i funkcja std::filesystem::exists()
  • iteracja po katalogu za pomocą directory_iterator

19 grudnia 2019 r: algorytmy

algorytmy
  • klasyfikacja algorytmów
  • iteratory i zakresy danych w algorytmach
  • algorytm for_each
  • algorytmy niemodyfikujące:
    • zliczanie elementów count
    • wartość minimalna i maksymalna min_element, max_element, minmax_element
    • wyszukiwanie pierwszego pasującego elementu find
    • wyszukiwanie pierwszego podzakresu search
    • porównywanie zakresów equal
    • wykrywanie sekwencji tych samych elementów w innym porządku is_permutation
    • porównywanie leksykograficzne lexicographical_compare
    • sprawdzanie czy zakres jest uporządkowany is_sorted, is_sorted_until
    • sprawdzanie rozdzielenia elementów is_partitioned, partition_point
    • sprawdzanie czy zakres jest kopcem is_heap, is_heap_until
    • wszystkie all_of, którykolwiek any_of, żaden none_of
  • algorytmy modyfikujące:
    • kopiowanie copy, copy_backward
    • przenoszenie elementów między zakresami move, move_backward
    • przekształcanie elementów transform
    • wymienianie elementów swap_ranges
    • przypisywanie tej samej wartości fill
    • przypisywanie wartości generowanych generate
    • zastępowanie wartości wewnątrz zakresureplace, replace_copy
  • algorytmy usuwające:
    • usuwanie elementów z zakresu remove, remove_copy
    • usuwanie kolejnych powtórzeń unique, unique_copy
  • algorytmy mutujące:
    • odwracanie kolejności elementów reverse, reverse_copy
    • przesunięcia cykliczne elementów rotate, rotate_copy
    • permutacje elementów next_permutation, prev_permutation
    • tasowanie elementów random, random_shuffle
    • rozdzielenie elementów partition, stable_partition, partition_copy
  • algorytmy sortujące:
    • sortowanie elementów sort, stable_sort
    • sortowanie częściowe partial_sort, partial_sort_copy
    • wybór n-tego co do wielkości elementu nth_element
  • algorytmy sortujące:
    • sortowanie elementów sort, stable_sort
    • sortowanie częściowe partial_sort, partial_sort_copy
    • wybór n-tego co do wielkości elementu nth_element
  • algorytmy kopcowe
    • utworzenie kopca make_heap
    • wstawienie elementu do kopca push_heap
    • przesunięcie elementu największego na koniec kopca pop_heap
    • sortowanie kopcowe sort_heap
  • algorytmy przeznaczone dla zakresów posortowanych
    • sprawdzanie obecności elementu binary_search
    • wyszukiwanie pierwszej lub ostatniej możliwej pozycji lower_bound, upper_bound
    • scalanie elementów merge, inplace_merge
    • wyznaczanie sumy dwóch posortowanych zbiorów set_union
    • wyznaczanie iloczynu dwóch posortowanych zbiorów set_intersection
    • wyznaczanie różnicy dwóch posortowanych zbiorów set_difference, set_symmetric_difference
  • algorytmy numeryczne
    • iterowanie i kumulowanie obliczeń accumulate
    • iloczynu skalarny inner_product
    • sumy częściowe partial_sum

9 stycznia 2020 r: metaprogramowanie

metaprogramowanie
  • funkcja typowa Conditional
  • funkcja typowa Select
  • iteracja za pomocą szalonów rekurencyjnych
  • definicja warunkowa Enable_if

slajdy: meta.pdf

16 stycznia 2020 r: współbieżność

współbieżność
  • współbieżność wysokiego poziomu: future i async
  • współbieżność niskiego poziomu: mutex
  • operacje atomowe

slajdy: watki.pdf