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
- 10, 11 października 2019: nowe elementy języka C++
- 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.
- 17, 18 października 2019: sprytne wskaźniki
- 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
).
- 24, 25 października 2019: czasomierze
- 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
.
- 14, 15 listopada 2019: funktory
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.
- 21, 22 listopada 2019: kolekcje
- 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.
- 21, 22 listopada 2019: liczby pseudolosowe
- 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:
- jednostajnym, używając
uniform_real_distribution
;
- dwumianowym, używając
binomial_distribution
;
- 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
- 28, 29 listopada 2019: liczby zespolone
- Zadanie 1 (2 pkt).
-
Zdefiniuj funkcje pracujące na liczbach zespolonych, które będą wyliczać wartość:
- funkcji gamma Eulera $\Gamma(z) = \frac{1}{z} \prod_{n=1}^{\infty}
\frac{(1+\frac{1}{n})^z}{1+\frac{z}{n}}$
- 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
- 12, 13 grudnia 2019: wyrażenia regularne
- 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.
- 19, 20 grudnia 2019: iteratory strumieniowe i plikowe
- 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
.
- 16, 17 stycznia 2020: algorytmy
- 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.
- 16, 17 stycznia 2020: metaprogramowanie
- 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, 24 stycznia 2020: współbieżność
- 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:
- dopuszczając zagłodzenie pisarzy;
- dopuszczając zagłodzenie czytelników;
- 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
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 zakresu
replace
, 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