Algorytmy, iteratory, kolekcje niestandardowe

Wielkość: px
Rozpocząć pokaz od strony:

Download "Algorytmy, iteratory, kolekcje niestandardowe"

Transkrypt

1 Algorytmy, iteratory, kolekcje niestandardowe Biblioteka STL Sebastian Deorowicz Politechnika Śląska Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

2 Plan wykładu 1 Iteratory Funkcje pomocnicze iteratorów Iteratory odwrotne Iteratory wstawiające Iteratory strumieniowe 2 Algorytmy Algorytmy modyfikujące Algorytmy sortowania i pochodne Algorytmy zbiorowe Algorytmy kopcowe Algorytmy inne Algorytmy matematyczne 3 Kolekcje niestandardowe SGI STL, STLPort, Borland C++ Builder 6+ MS Visual C++ C++ TR1 Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

3 Plan wykładu 1 Iteratory Funkcje pomocnicze iteratorów Iteratory odwrotne Iteratory wstawiające Iteratory strumieniowe 2 Algorytmy Algorytmy modyfikujące Algorytmy sortowania i pochodne Algorytmy zbiorowe Algorytmy kopcowe Algorytmy inne Algorytmy matematyczne 3 Kolekcje niestandardowe SGI STL, STLPort, Borland C++ Builder 6+ MS Visual C++ C++ TR1 Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

4 Funkcje pomocnicze iteratorów template <class InputIterator, class Distance> void advance(inputiterator& i, Distance n) Działanie: Przesuwa iterator o n pozycji w przód Parametry: i iterator wejściowy, postępujący, dwukierunkowy, bądź dostępu swobodnego n liczba elementów Distance w zasadzie typ całkowity, ponieważ muszą być dla niego dostępne operacje <, ++, --, porównania z 0 Zwracana wartość: brak Złożoność: O(1) dla iteratorów dostępu swobodnego O(n) dla pozostałych iteratorów Uwaga: Funkcja nie sprawdza czy nastąpiło przekroczenie zakresu Dla iteratorów dwukierunkowych lub dostępu swobodnego n może być mniejsze od 0 Funkcja w zależności od typu iteratora sama wybiera sposób inkrementacji (opierając się na cechach iteratorów [ang. iterator traits]) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

5 Funkcje pomocnicze iteratorów template <class InputIterator> typename iterator_traits<inputiterator>::difference_type distance(inputiterator first, InputIterator last) Działanie: Zwraca odległość między iteratorami Parametry: first, last iteratory Zwracana wartość: Odległość między iteratorami, zwykle typu int Złożoność: O(1) dla iteratorów dostępu swobodnego O(last first) dla iteratorów wejściowych, postępujących i dwukierunkowych Uwagi: Funkcja automatycznie wykorzystuje najlepszą implementację do wyznaczenia odległości last powinien być osiągalny z first, bo jeśli nie to zachowanie niezdefiniowane Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

6 Funkcje pomocnicze iteratorów template <class InputIterator> void iter_swap(forwarditerator iter1, ForwardIterator iter2) Działanie: Zamienia wartości elementów, które wskazują iteratory iter1, iter2 Parametry: iter1, iter2 iteratory Zwracana wartość: Brak Złożoność: O(1) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

7 Iteratory odwrotne Opis Są adaptatorami iteratorów, w których przedefiniowano operacje inkrementacji i dekrementacji Przydają się czasami np. jeśli wyszukujemy jakiegoś elementu, a następnie chcemy, aby algorytm przetworzył elementy wcześniejsze w odwrotnym porządku Możliwa jest konwersja iteratorów zwykłych na odwrotne (a także w drugą stronę) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

8 Iteratory odwrotne przykład Przykład #include <iostream> #include <vector> #include <algorithm> const int MAX = 10; using namespace std; int main(int argc, char* argv[]) { int tab[max] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; vector<int> vi(tab, tab+max); ShowCollection(vi); vector<int>::iterator p = find(vi.begin(), vi.end(), 6); cout << *p << endl; // 6 vector<int>::reverse_iterator q(p); cout << *q << endl; // 5 } vector<int>::iterator r(q.base()); cout << *r << endl; // 6 Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

9 Iteratory odwrotne konwersja O co chodzi? Podczas konwersji iteratora na odwrotny zmienia się pozycja wskazywana! Dlaczego?! No cóż, to cecha iteratorów Z iteratorami zwykłymi jest tak, że wskazują one na obszar pamięci; iterator na pozycję za ostatnią też wskazuje na pewien obszar pamięci (zaraz za ostatnim elementem) Problem z iteratorami odwrotnymi bierze się z tego, że też powinno być możliwe wskazywanie na element bezpośrednio przed pierwszym elementem kolekcji taki obszar pamięci może jednak w ogóle nie istnieć! W praktyce iterator zwracany przez rbegin() wskazuje to samo(!) co iterator zwracany przez end() Dla iteratorów odwrotnych inaczej jest zdefiniowana operacja dereferencji odnosi się ona do elementu o jedną pozycję wcześniejszego niż przechowywana przez iterator! Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

10 Iteratory odwrotne konwersja O co chodzi? Podczas konwersji iteratora na odwrotny zmienia się pozycja wskazywana! Dlaczego?! No cóż, to cecha iteratorów Z iteratorami zwykłymi jest tak, że wskazują one na obszar pamięci; iterator na pozycję za ostatnią też wskazuje na pewien obszar pamięci (zaraz za ostatnim elementem) Problem z iteratorami odwrotnymi bierze się z tego, że też powinno być możliwe wskazywanie na element bezpośrednio przed pierwszym elementem kolekcji taki obszar pamięci może jednak w ogóle nie istnieć! W praktyce iterator zwracany przez rbegin() wskazuje to samo(!) co iterator zwracany przez end() Dla iteratorów odwrotnych inaczej jest zdefiniowana operacja dereferencji odnosi się ona do elementu o jedną pozycję wcześniejszego niż przechowywana przez iterator! Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

11 Iteratory odwrotne konwersja Konwersja w drugą stronę Do konwersji iteratora odwrotnego na iterator zwykły służy metoda base() udostępniana przez iteratory odwrotne Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

12 Iteratory wstawiające Problem Podczas wykonywania wielu algorytmów wymagane jest, aby obszar docelowy był dostatecznie duży, bo nie jest wykonywana żadna kontrola zakresu W niektórych przypadkach to nie jest duży problem, bo z góry wiadomo jak duży powinien być obszar docelowy Istnieją jednak sytuacje, w których nie wiadomo tego z góry (np. przy wywołaniu algorytmu replace_copy_if) i najpierw trzeba by było obliczyć jego rozmiar Rozwiązanie Istnieją iteratory wstawiające, które są adaptatorami iteratorów, w których operacja przypisania nowej wartości jest implementowana jak operacja wstawienia tej wartości Iteratory wstawiające nie nadpisują elementów, a wstawiają je Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

13 Iteratory wstawiające Problem Podczas wykonywania wielu algorytmów wymagane jest, aby obszar docelowy był dostatecznie duży, bo nie jest wykonywana żadna kontrola zakresu W niektórych przypadkach to nie jest duży problem, bo z góry wiadomo jak duży powinien być obszar docelowy Istnieją jednak sytuacje, w których nie wiadomo tego z góry (np. przy wywołaniu algorytmu replace_copy_if) i najpierw trzeba by było obliczyć jego rozmiar Rozwiązanie Istnieją iteratory wstawiające, które są adaptatorami iteratorów, w których operacja przypisania nowej wartości jest implementowana jak operacja wstawienia tej wartości Iteratory wstawiające nie nadpisują elementów, a wstawiają je Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

14 Iteratory wstawiające Rodzaje iteratorów wstawiających Iterator wstawiający na koniec Iterator wstawiający na początek Ogólny iterator wstawiający Czym się różnią od zwykłych iteratorów? Zwykły iterator nie wie na elementy jakiej kolekcji wskazuje Iterator wskazujący musi wiedzieć jakiego typu jest kolekcja, której dotyczy, żeby wiedzieć jaką metodę kolekcji wywołać Iterator wskazujący jest inicjalizowany obiektem kolekcji, której dotyczy! Iterator ogólny musi być dodatkowo inicjalizowany pozycją, na której będzie wstawiał elementy Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

15 Iteratory wstawiające Rodzaje iteratorów wstawiających Iterator wstawiający na koniec Iterator wstawiający na początek Ogólny iterator wstawiający Czym się różnią od zwykłych iteratorów? Zwykły iterator nie wie na elementy jakiej kolekcji wskazuje Iterator wskazujący musi wiedzieć jakiego typu jest kolekcja, której dotyczy, żeby wiedzieć jaką metodę kolekcji wywołać Iterator wskazujący jest inicjalizowany obiektem kolekcji, której dotyczy! Iterator ogólny musi być dodatkowo inicjalizowany pozycją, na której będzie wstawiał elementy Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

16 Algorytmy przykład Przykład #include <algorithm> #include <deque> #include <iterator> using namespace std; int main(int argc, char* argv[]) { deque<int> di; front_insert_iterator<deque<int> > di_f_iter(di); back_insert_iterator<deque<int> > di_b_iter(di); *di_f_iter = 5; *di_f_iter = 10; ShowCollection(di); // 10 5 *di_b_iter = 11; *di_b_iter = 6; ShowCollection(di); // insert_iterator<deque<int> > di_i_iter(di, di.begin()+1); *di_i_iter = 13; ShowCollection(di); // back_inserter(di) = 16; ShowCollection(di); // } copy(di.begin(), di.end(), front_inserter(di)); ShowCollection(di); // Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

17 Iteratory wstawiające Iterator wstawiający z przodu Wywołuje metodę: push_front(val) Wzorzec klasy: front_insert_iterator Funkcja tworząca: front_inserter(coll) Iterator wstawiający na koniec Wywołuje metodę: push_back(val) Wzorzec klasy: back_insert_iterator Funkcja tworząca: back_inserter(coll) Iterator wstawiający ogólny Wywołuje metodę: insert(pos, val) Wzorzec klasy: insert_iterator Funkcja tworząca: inserter(coll, pos) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

18 Iteratory strumieniowe Opis Do tej pory jeśli chcieliśmy coś wypisać do strumienia (np. na standardowe wyjście), to dla każdego elementu wykonywaliśmy operację wypisywania do strumienia (operator <<) Iteratory strumieniowe pozwalają na iterowanie bezpośrednio po strumieniu Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

19 Iteratory strumieniowe wyjściowe konstruktory ostream_iterator(ostream_type& s) Opis: Tworzy iterator strumieniowy operujący na strumieniu s ostream_iterator(ostream_type& s, const chart* delimiter) Opis: Tworzy iterator strumieniowy operujący na strumieniu s, przy czym separatorem będzie delimiter ostream_iterator(const ostream_iterator<t, chart, traits>& x) Opis: Konstruktor kopiujący Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

20 Iteratory strumieniowe wyjściowe inne operacje ostream_iterator<t, chart, traits>& operator=(const T& value) Opis: Wypisuje wartość value do strumienia ostream_iterator<t, chart, traits>& operator*() Opis: Zwraca *this ostream_iterator<t, chart, traits>& operator++() ostream_iterator<t, chart, traits>& operator++(int) Opis: Inkrementacja pozycji Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

21 Iteratory strumieniowe wejściowe Opis Podobnie jak istnieją iteratory strumieniowe wyjściowe tak też istnieją iteratory strumieniowe wejściowe Służą one do wczytywania danych ze strumienia Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

22 Iteratory strumieniowe wejściowe konstruktory istream_iterator(istream_type& s) Opis: Tworzy iterator strumieniowy wejściowy dla strumienia s istream_iterator(const istream_iterator<t, chart, traits, Distance>& x) Opis: Konstruktor kopiujący Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

23 Iteratory strumieniowe wejściowe inne operacje const T& operator*() const Opis: Odczytuje wartość ze strumienia const T* operator->() const Opis: Zwraca składową aktualnej wartości (wcześniej odczytanej) istream_iterator<t, chart, traits, Distance>& operator++() istream_iterator<t, chart, traits, Distance> operator++(int) Opis: Inkrementuje pozycję iteratora Inne Zdefiniowane operatory == i!= porównywania iteratorów Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

24 Iteratory strumieniowe przykład #include <algorithm> #include <fstream> #include <iostream> #include <iterator> #include <list> #include <map> #include <string> #include <vector> using namespace std; typedef map<string, list<string> > t_dict; t_dict dict; struct sort_letters { inline void operator()(string& s) { string t(s); sort(t.begin(), t.end()); dict[t].push_back(s); }; }; struct longest_list { inline bool operator()(pair<string, list<string> > &x, pair<string, list<string> > &y) { return x.second.size() < y.second.size(); } }; int main(int argc, char* argv[]) { ifstream inf("slownik"); istream_iterator<string> inf_iter(inf); vector<string> vs(inf_iter, istream_iterator<string>()); for_each(vs.begin(), vs.end(), sort_letters()); t_dict::iterator m = max_element(dict.begin(), dict.end(), longest_list()); ostream_iterator<string> ouf_iter(cout, " "); copy(m->second.begin(), m->second.end(), ouf_iter); } Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

25 Iteratory strumieniowe przykład Jakie będą wyniki dla słownika j. polskiego? akrom arkom karmo karom komar makro marko mokra morka rakom ramko Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

26 Plan wykładu 1 Iteratory Funkcje pomocnicze iteratorów Iteratory odwrotne Iteratory wstawiające Iteratory strumieniowe 2 Algorytmy Algorytmy modyfikujące Algorytmy sortowania i pochodne Algorytmy zbiorowe Algorytmy kopcowe Algorytmy inne Algorytmy matematyczne 3 Kolekcje niestandardowe SGI STL, STLPort, Borland C++ Builder 6+ MS Visual C++ C++ TR1 Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

27 Algorytmy replace if void replace_if(forwarditerator first, ForwardIterator last, Predicate pred, const T& new_value) Działanie: Zamienia wartość elementów z zakresu [first, last), dla których predykat pred zwrócił wartość true na new_value Parametry: first, last iteratory specyfikujące zakres pred predykat (obiekt funkcyjny bądź wskaźnik na funkcję) wykorzystywany do sprawdzenia czy element należy nadpisać new_value nowa wartość elementów Zwracana wartość: brak Złożoność: O(last first) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

28 Algorytm replace copy OutputIterator replace_copy(inputiterator first, InputIterator last, OutputIterator result, const T& old_value, const T& new_value) Działanie: Złożenie algorytmów replace i copy. Wykonuje kopiowanie elementów z zakresu [first, last) do zakresu rozpoczynającego się od result zamieniając jednocześnie wszystkie wystąpienia elementów old_value na new_value Parametry: first, last iteratory specyfikujące źródłowy zakres result iterator specyfikujący początek zakresu docelowego old_value wartość zamieniania new_value nowa wartość Zwracana wartość: Iterator do elementu bezpośrednio za ostatnim skopiowanym z zakresu docelowego Złożoność: O(last first) Uwaga: Zakresy źródłowy i docelowy nie powinny na siebie nachodzić Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

29 Algorytm replace copy if OutputIterator replace_copy_if(inputiterator first, InputIterator last, OutputIterator result, Predicate pred, const T& new_value) Działanie: Złożenie algorytmów replace if i copy Parametry: first, last iteratory specyfikujące źródłowy zakres result iterator specyfikujący początek zakresu docelowego pred predykat (obiekt funkcyjny bądź wskaźnik na funkcję) wykorzystywany do sprawdzenia czy element należy nadpisać new_value nowa wartość Zwracana wartość: Iterator do elementu bezpośrednio za ostatnim skopiowanym z zakresu docelowego Złożoność: O(last first) Uwaga: Zakresy źródłowy i docelowy nie powinny na siebie nachodzić Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

30 Algorytmy fill void fill(forwarditerator first, ForwardIterator last, const T& value) Działanie: Nadpisuje elementy z zakresu [first, last) wartością value Parametry: first, last iteratory specyfikujące źródłowy zakres value nowa wartość Zwracana wartość: brak Złożoność: O(last first) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

31 Algorytmy fill n void fill_n(outputiterator first, Size n, const T& value) Działanie: Wypełnia n elementów począwszy od pozycji first wartością value Parametry: first iterator specyfikujący początek zakresu n liczba elementów value nowa wartość Zwracana wartość: brak Złożoność: O(n) Uwaga: Brak kontroli zakresu Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

32 Algorytmy generate void generate(forwarditerator first, ForwardIterator last, Generator gen) Działanie: Wypełnia elementy z zakresu [first, last) wartością zwracaną przez generator gen Parametry: first, last iteratory specyfikujące źródłowy zakres gen obiekt funkcyjny (bądź wskaźnik na funkcję) posiadający bezparametrową metodę operator() zwracającą wartość wstawianą do elementu; metoda jest wywoływana jednorazowo dla każdego elementu Zwracana wartość: brak Złożoność: O(last first) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

33 Algorytm generate n void generate_n(outputiterator first, Size n, Generator gen) Działanie: Wypełnia n elementów począwszy od pozycji first wartością zwracaną przez generator gen Parametry: first iterator specyfikujący początek zakresu n liczba elementów gen obiekt funkcyjny (bądź wskaźnik na funkcję) posiadający bezparametrową metodę operator() zwracającą wartość wstawianą do elementu; metoda jest wywoływana jednorazowo dla każdego elementu Zwracana wartość: brak Złożoność: O(n) Uwaga: Brak kontroli zakresu Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

34 Algorytmy przykład Przykład #include <iostream> #include <vector> #include <algorithm> const int MAX = 10; using namespace std; template<class T> struct reader { inline T operator()() { T x; cin >> x; return x; } }; int main(int argc, char* argv[]) { int tab[max] = {1, 4, 3, 6, 7, 4, 7, 8, 9, 0}; vector<int> vi(tab, tab+max); ShowCollection(vi); // fill_n(vi.begin()+1, 3, 6); ShowCollection(vi); // } generate_n(vi.begin(), 2, reader<int>()); // 8 9 ShowCollection(vi); // Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

35 Algorytm unique ForwardIterator unique(forwarditerator first, ForwardIterator last) Działanie: Usuwa powtarzające się elementy na kolejnych pozycjach pozostawiając tylko po jednej kopii Parametry: first, last iteratory specyfikujące źródłowy zakres Zwracana wartość: Iterator do pozycji bezpośrednio za ostatnią Złożoność: O(last first) Uwaga: Podobnie jak algorytm remove nie usuwa fizycznie tych elementów a jedynie nadpisuje je zwracając nowy logiczny koniec; elementy należy później usunąć za pomocą metody erase z kolekcji Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

36 Algorytm unique ForwardIterator unique(forwarditerator first, ForwardIterator last, BinaryPredicate pred) Działanie: Usuwa powtarzające się elementy na kolejnych pozycjach pozostawiając tylko po jednej kopii Parametry: first, last iteratory specyfikujące źródłowy zakres pred predykat binarny wykorzystywany do porównywania element zamiast operatora == Zwracana wartość: Iterator do pozycji bezpośrednio za ostatnią Złożoność: O(last first) Uwaga: Podobnie jak algorytm remove nie usuwa fizycznie tych elementów a jedynie nadpisuje je zwracając nowy logiczny koniec; elementy należy później usunąć za pomocą metody erase z kolekcji Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

37 Algorytm unique copy OutputIterator unique_copy(inputiterator first, InputIterator last, OutputIterator result) Działanie: Kopiuje elementy z zakresu źródłowego do docelowego pomijając wielokrotne powtórzenia tych samych elementów na kolejnych pozycjach Parametry: first, last iteratory specyfikujące źródłowy zakres źródłowy result iterator specyfikujący początek zakresu docelowego Zwracana wartość: Iterator do pozycji bezpośrednio za ostatnią z zakresu docelowego Złożoność: O(last first) Uwaga: Brak kontroli zakresu Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

38 Algorytm unique copy OutputIterator unique_copy(inputiterator first, InputIterator last, OutputIterator result, BinaryPredicate pred) Działanie: Kopiuje elementy z zakresu źródłowego do docelowego pomijając wielokrotne powtórzenia tych samych elementów na kolejnych pozycjach Parametry: first, last iteratory specyfikujące źródłowy zakres źródłowy result iterator specyfikujący początek zakresu docelowego pred predykat używany do porównywania elementów zamiast operatora == Zwracana wartość: Iterator do pozycji bezpośrednio za ostatnią z zakresu docelowego Złożoność: O(last first) Uwaga: Brak kontroli zakresu Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

39 Algorytmy partial sort copy RandomAccessIterator partial_sort_copy(inputiterator first, InputIterator last, RandomAccessIterator result_first, RandomAccessIterator result_last) Działanie: Umieszcza najmniejsze min(last first, result_last result_first) posortowanych elementów z zakresu źródłowego w zakresie docelowym Parametry: first, last iteratory specyfikujące zakres źródłowy result_first, result_last iteratory specyfikujące zakres docelowy Zwracana wartość: Iterator do elementu bezpośrednio za ostatnim wpisanym do zakresu docelowego Złożoność: O(n log k), gdzie n jest liczbą elementów w zakresie źródłowym, a k jest liczbą posortowanych elementów Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

40 Algorytmy partial sort copy RandomAccessIterator partial_sort_copy(inputiterator first, InputIterator last, RandomAccessIterator result_first, RandomAccessIterator result_last, Compare comp) Działanie: Umieszcza najmniejsze min(last first, result_last result_first) posortowanych elementów z zakresu źródłowego w zakresie docelowym Parametry: first, last iteratory specyfikujące zakres źródłowy result_first, result_last iteratory specyfikujące zakres docelowy comp predykat używany do porównywania elementów zamiast operatora < Zwracana wartość: Iterator do elementu bezpośrednio za ostatnim wpisanym do zakresu docelowego Złożoność: O(n log k), gdzie n jest liczbą elementów w zakresie źródłowym, a k jest liczbą posortowanych elementów Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

41 Algorytmy nth element void nth_element(randomaccessiterator first, RandomAccessIterator nth, RandomAccessIterator last) void nth_element(randomaccessiterator first, RandomAccessIterator nth, RandomAccessIterator last, Compare comp) Działanie: Częściowo sortuje elementy, aby na pozycji n znalazł się element n-ty co do wielkości, wszystkie elementy niewiększe od niego były na wcześniejszych pozycjach, a wszystkie niemniejsze na późniejszych Parametry: first, last iteratory specyfikujące zakres nth iterator specyfikujący n-ty element comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany do porównywania elementów zamiast operatora < Zwracana wartość: brak Złożoność: O(last first) w przypadku średnim Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

42 Algorytmy lower bound ForwardIterator lower_bound(forwarditerator first, ForwardIterator last, const T& value) ForwardIterator lower_bound(forwarditerator first, ForwardIterator last, const T& value, Compare comp) Działanie: Wyszukuje pierwszą pozycję o wartości elementu niemniejszej niż value w zakresie [first, last) Parametry: first, last iteratory specyfikujące zakres value wyszukiwana wartość comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany przy wyszukiwaniu zamiast operatora < Zwracana wartość: Iterator do znalezionej pozycji Złożoność: O(log(last first)) Uwaga: działa tylko dla posortowanych zakresów Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

43 Algorytmy upper bound ForwardIterator upper_bound(forwarditerator first, ForwardIterator last, const T& value) ForwardIterator upper_bound(forwarditerator first, ForwardIterator last, const T& value, Compare comp) Działanie: Wyszukuje pierwszą pozycję o wartości elementu większej niż value w zakresie [first, last) Parametry: first, last iteratory specyfikujące zakres value wyszukiwana wartość comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany przy wyszukiwaniu zamiast operatora < Zwracana wartość: Iterator do znalezionej pozycji Złożoność: O(log(last first)) Uwaga: działa tylko dla posortowanych zakresów Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

44 Algorytmy equal range pair<forwarditerator, ForwardIterator> equal_range(forwarditerator first, ForwardIterator last, const T& value) pair<forwarditerator, ForwardIterator> equal_range(forwarditerator first, ForwardIterator last,const T& value, Compare comp) Działanie: Wyszukuje zakres elementów o wartościach równych value w zakresie [first, last) Parametry: first, last iteratory specyfikujące zakres value wyszukiwana wartość comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany przy wyszukiwaniu zamiast operatora < Zwracana wartość: Para iteratorów, z których pierwszy wskazuje na pierwszy element sekwencji równy value, a drugi na pierwszy element za ostatnim elementem sekwencji równym value Złożoność: O(log(last first)) Uwaga: działa tylko dla posortowanych zakresów Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

45 Algorytmy binary search bool binary_search(forwarditerator first, ForwardIterator last, const T& value) bool binary_search(forwarditerator first, ForwardIterator last, const T& value, Compare comp) Działanie: Sprawdza czy element o wartości value występuje w zakresie [first, last) Parametry: first, last iteratory specyfikujące zakres value wyszukiwana wartość comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany przy wyszukiwaniu zamiast operatora < Zwracana wartość: true jeśli element został znaleziony, false w przeciwnym przypadku Złożoność: O(log(last first)) Uwaga: działa tylko dla posortowanych zakresów Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

46 Algorytmy merge OutputIterator merge(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) Działanie: Łączy dwa posortowane zakresy, [first1, last1) oraz [first2, last2), w jeden posortowany zakres zaczynający się od pozycji result Parametry: first1, last1, first2, last2 iteratory specyfikujące zakresy źródłowe result iterator specyfikujący początek zakresu docelowego Zwracana wartość: Iterator do pierwszego elementu za ostatnim w docelowym zakresie Złożoność: O((last1 first1) + (last2 first2)) Uwaga: Zakres docelowy nie powinien się nakładać z żadnym z zakresów źródłowych Zakres docelowy musi być dostatecznie duży (brak kontroli zakresów) Zakresy źródłowe nie są modyfikowane Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

47 Algorytmy merge OutputIterator merge(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp) Działanie: Łączy dwa posortowane zakresy, [first1, last1) oraz [first2, last2), w jeden posortowany zakres zaczynający się od pozycji result Parametry: first1, last1, first2, last2 iteratory specyfikujące zakresy źródłowe result iterator specyfikujący początek zakresu docelowego comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany przy porównywaniu elementów zamiast operatora < Zwracana wartość: Iterator do pierwszego elementu za ostatnim w docelowym zakresie Złożoność: O((last1 first1) + (last2 first2)) Uwaga: Zakres docelowy nie powinien się nakładać z żadnym z zakresów źródłowych Zakres docelowy musi być dostatecznie duży (brak kontroli zakresów) Zakresy źródłowe nie są modyfikowane Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

48 Algorytmy przykład Przykład #include <algorithm> #include <list> #include <vector> const int MAX = 10; using namespace std; int main(int argc, char* argv[]) { int tab[10] = {1, 4, 3, 6, 7, 4, 7, 4, 9, 0}; vector<int> vi1(tab, tab+5); list<int> li2(tab+5, tab+max); vector<int> vi3(10, 0); } ShowCollection(vi1); // ShowCollection(li2); // merge(vi1.begin(), vi1.end(), li2.begin(), li2.end(), vi3.begin()); ShowCollection(vi3); // sort(vi1.begin(), vi1.end()); li2.sort(); merge(vi1.begin(), vi1.end(), li2.begin(), li2.end(), vi3.begin()); ShowCollection(vi3); // vector<int>::iterator new_end = unique(vi3.begin(), vi3.end()); ShowCollection(vi3); // vi3.erase(new_end, vi3.end()); ShowCollection(vi3); // Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

49 Algorytmy inplace merge void inplace_merge(bidirectionaliterator first, BidirectionalIterator middle, BidirectionalIterator last) void inplace_merge(bidirectionaliterator first, BidirectionalIterator middle, BidirectionalIterator last, Compare comp) Działanie: Łączy dwa sąsiednie posortowane zakresy, [first, middle) oraz [middle, last), umieszczając wynik w zakresie [first, last) Parametry: first, middle, last iteratory specyfikujące zakresy comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany przy porównywaniu elementów zamiast operatora < Zwracana wartość: Brak Złożoność: O(n) jeśli jest dostępne wystarczająco dużo dodatkowej pamięci (n łączna liczba elementów) O(n log n) jeśli jest dostępne wystarczająco dużo dodatkowej pamięci (n łączna liczba elementów) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

50 Algorytmy zbiorowe includes bool includes(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2) bool includes(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp) Działanie: Sprawdza czy wszystkie elementy zakresu [first2, last2) występują w zakresie [first1, last1) Parametry: first1, last1, first2, last2 iteratory specyfikujące zakresy comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany przy porównywaniu elementów zamiast operatora < Zwracana wartość: true jeśli wszystkie elementy drugiego zakresu występują w większym Złożoność: O((last1 first1) + (last2 first2)) Uwaga: Jeśli drugi zakres zawiera kilka wystąpień tego samego elementu, to pierwszy zakres musi zawierać przynajmniej tyle samo wystąpień tego elementu, żeby wynikiem mogło być true Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

51 Algorytmy zbiorowe set union OutputIterator set_union(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) Działanie: Łączy dwa zakresy, [first1, last1) oraz [first2, last2), traktując je jak posortowane zbiory do zakresu docelowego element zostaje wpisany jeśli występuje w przynajmniej jednym z zakresów. Liczba wystąpień każdego z elementów w zakresie docelowym jest większą z liczb wystąpień w zakresach źródłowych. Wynik zapisuje w zakresie rozpoczynającym się od result. Parametry: first1, last1, first2, last2 iteratory specyfikujące zakresy źródłowe result początek zakresu docelowego Zwracana wartość: Iterator do pozycji za ostatnią w zakresie docelowym Złożoność: O((last1 first1) + (last2 first2)) Uwaga: brak kontroli zakresu (zakres docelowy musi być dostatecznie duży) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

52 Algorytmy zbiorowe set union OutputIterator set_union(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp) Działanie: Łączy dwa zakresy, [first1, last1) oraz [first2, last2), traktując je jak posortowane zbiory do zakresu docelowego element zostaje wpisany jeśli występuje w przynajmniej jednym z zakresów. Liczba wystąpień każdego z elementów w zakresie docelowym jest większą z liczb wystąpień w zakresach źródłowych. Wynik zapisuje w zakresie rozpoczynającym się od result. Parametry: first1, last1, first2, last2 iteratory specyfikujące zakresy źródłowe result początek zakresu docelowego comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany przy porównywaniu elementów zamiast operatora < Zwracana wartość: Iterator do pozycji za ostatnią w zakresie docelowym Złożoność: O((last1 first1) + (last2 first2)) Uwaga: brak kontroli zakresu (zakres docelowy musi być dostatecznie duży) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

53 Algorytmy zbiorowe set intersection OutputIterator set_intersection(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) Działanie: Wykonuje przecięcie dwóch zakresów, [first1, last1) oraz [first2, last2), traktując je jak posortowane zbiory do zakresu docelowego element zostaje wpisany jeśli występuje w obydwu z zakresów. Liczba wystąpień każdego z elementów w zakresie docelowym jest mniejszą z liczb wystąpień w zakresach źródłowych. Wynik zapisuje w zakresie rozpoczynającym się od result. Parametry: first1, last1, first2, last2 iteratory specyfikujące zakresy źródłowe result początek zakresu docelowego Zwracana wartość: Iterator do pozycji za ostatnią w zakresie docelowym Złożoność: O((last1 first1) + (last2 first2)) Uwaga: brak kontroli zakresu (zakres docelowy musi być dostatecznie duży) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

54 Algorytmy zbiorowe set intersection OutputIterator set_intersection(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp) Działanie: Wykonuje przecięcie dwóch zakresów, [first1, last1) oraz [first2, last2), traktując je jak posortowane zbiory do zakresu docelowego element zostaje wpisany jeśli występuje w obydwu z zakresów. Liczba wystąpień każdego z elementów w zakresie docelowym jest mniejszą z liczb wystąpień w zakresach źródłowych. Wynik zapisuje w zakresie rozpoczynającym się od result. Parametry: first1, last1, first2, last2 iteratory specyfikujące zakresy źródłowe result początek zakresu docelowego comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany przy porównywaniu elementów zamiast operatora < Zwracana wartość: Iterator do pozycji za ostatnią w zakresie docelowym Złożoność: O((last1 first1) + (last2 first2)) Uwaga: brak kontroli zakresu (zakres docelowy musi być dostatecznie duży) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

55 Algorytmy zbiorowe set difference OutputIterator set_difference(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) Działanie: Oblicza różnicę dwóch zakresów, [first1, last1) oraz [first2, last2), traktując je jak posortowane zbiory do zakresu docelowego element zostaje wpisany jeśli występuje w pierwszym zakresie, ale nie występuje w drugim. Liczba wystąpień każdego z elementów w zakresie docelowym jest liczbą wystąpień w pierwszym zakresie pomniejszoną o liczbę wystąpień w drugim zakresie (bądź zerem). Wynik zapisuje w zakresie rozpoczynającym się od result. Parametry: first1, last1, first2, last2 iteratory specyfikujące zakresy źródłowe result początek zakresu docelowego Zwracana wartość: Iterator do pozycji za ostatnią w zakresie docelowym Złożoność: O((last1 first1) + (last2 first2)) Uwaga: brak kontroli zakresu (zakres docelowy musi być dostatecznie duży) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

56 Algorytmy zbiorowe set difference OutputIterator set_difference(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp) Działanie: Oblicza różnicę dwóch zakresów, [first1, last1) oraz [first2, last2), traktując je jak posortowane zbiory do zakresu docelowego element zostaje wpisany jeśli występuje w pierwszym zakresie, ale nie występuje w drugim. Liczba wystąpień każdego z elementów w zakresie docelowym jest liczbą wystąpień w pierwszym zakresie pomniejszoną o liczbę wystąpień w drugim zakresie (bądź zerem). Wynik zapisuje w zakresie rozpoczynającym się od result. Parametry: first1, last1, first2, last2 iteratory specyfikujące zakresy źródłowe result początek zakresu docelowego comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany przy porównywaniu elementów zamiast operatora < Zwracana wartość: Iterator do pozycji za ostatnią w zakresie docelowym Złożoność: O((last1 first1) + (last2 first2)) Uwaga: brak kontroli zakresu (zakres docelowy musi być dostatecznie duży) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

57 Algorytmy zbiorowe set symmetric difference OutputIterator set_symmetric_difference(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) Działanie: Oblicza symetryczną różnicę dwóch zakresów, [first1, last1) oraz [first2, last2), traktując je jak posortowane zbiory do zakresu docelowego element zostaje wpisany jeśli występuje w dokładnie jednym z zakresów źródłowych. Liczba wystąpień każdego z elementów w zakresie docelowym jest różnicą liczby wystąpień w zakresach źródłowych (bądź zerem). Wynik zapisuje w zakresie rozpoczynającym się od result. Parametry: first1, last1, first2, last2 iteratory specyfikujące zakresy źródłowe result początek zakresu docelowego Zwracana wartość: Iterator do pozycji za ostatnią w zakresie docelowym Złożoność: O((last1 first1) + (last2 first2)) Uwaga: brak kontroli zakresu (zakres docelowy musi być dostatecznie duży) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

58 Algorytmy zbiorowe set symmetric difference OutputIterator set_symmetric_difference(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp) Działanie: Oblicza symetryczną różnicę dwóch zakresów, [first1, last1) oraz [first2, last2), traktując je jak posortowane zbiory do zakresu docelowego element zostaje wpisany jeśli występuje w dokładnie jednym z zakresów źródłowych. Liczba wystąpień każdego z elementów w zakresie docelowym jest różnicą liczby wystąpień w zakresach źródłowych (bądź zerem). Wynik zapisuje w zakresie rozpoczynającym się od result. Parametry: first1, last1, first2, last2 iteratory specyfikujące zakresy źródłowe result początek zakresu docelowego comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany przy porównywaniu elementów zamiast operatora < Zwracana wartość: Iterator do pozycji za ostatnią w zakresie docelowym Złożoność: O((last1 first1) + (last2 first2)) Uwaga: brak kontroli zakresu (zakres docelowy musi być dostatecznie duży) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

59 Algorytmy przykład Przykład #include <list> #include <vector> #include <algorithm> using namespace std; int main(int argc, char* argv[]) { string inf[] = {"PK1", "TA", "Mat", "Fiz", "Fil"}; string zarz[] = {"Eko", "WF", "Mat", "Ang", "Fil"}; vector<string> vi(inf, inf+5); vector<string> vz(zarz, zarz+5); list<string> lr; back_insert_iterator<list<string> > iter(lr); sort(vi.begin(), vi.end()); sort(vz.begin(), vz.end()); } // Lacznie przedmioty set_union(vi.begin(), vi.end(), vz.begin(), vz.end(), iter); ShowCollection(lr); // Ang Eko Fil Fiz Mat PK1 TA WF // Powtorzone przedmioty lr.clear(); set_intersection(vi.begin(), vi.end(), vz.begin(), vz.end(), iter); ShowCollection(lr); // Fil Mat // Tylko inf lr.clear(); set_difference(vi.begin(), vi.end(), vz.begin(), vz.end(), iter); ShowCollection(lr); // Fiz PK1 TA Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

60 Algorytmy kopcowe push heap void make_heap(randomaccessiterator first, RandomAccessIterator last) void make_heap(randomaccessiterator first, RandomAccessIterator last, Compare comp) Działanie: Przekształca zakres [first, last) w taki sposób, aby zawierał on elementy uporządkowane w postaci kopca Parametry: first, last iteratory specyfikujące zakres comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany zamiast operatora < jako relacja mniejszości Zwracana wartość: brak Złożoność: O(last first) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

61 Algorytmy kopcowe pop heap void pop_heap(randomaccessiterator first, RandomAccessIterator last) void pop_heap(randomaccessiterator first, RandomAccessIterator last, Compare comp) Działanie: Zamienia pierwszy element zakresu [first, last) z ostatnim i z elementów [first, last 1) tworzy kopiec Parametry: first, last iteratory specyfikujące zakres comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany zamiast operatora < jako relacja mniejszości Zwracana wartość: brak Złożoność: O(log(last first)) Uwaga: Przed wykonaniem algorytmu zakres [first, last) musi zawierać poprawny kopiec Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

62 Algorytmy kopcowe make heap void push_heap(randomaccessiterator first, RandomAccessIterator last) void push_heap(randomaccessiterator first, RandomAccessIterator last, Compare comp) Działanie: Dodaje element znajdujący się na pozycji last 1 do kopca znajdującego się w zakresie [first, last 1). Po wykonaniu algorytmu zakres [first, last) zawiera poprawny kopiec Parametry: first, last iteratory specyfikujące zakres comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany zamiast operatora < jako relacja mniejszości Zwracana wartość: brak Złożoność: O(log(last first)) Uwaga: Przed wykonaniem algorytmu zakres [first, last 1) musi zawierać poprawny kopiec Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

63 Algorytmy kopcowe sort heap void sort_heap(randomaccessiterator first, RandomAccessIterator last) void sort_heap(randomaccessiterator first, RandomAccessIterator last, Compare comp) Działanie: Sortuje elementy z zakresu [first, last) zawierającego kopiec Parametry: first, last iteratory specyfikujące zakres comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany zamiast operatora < jako relacja mniejszości Zwracana wartość: brak Złożoność: O(n log n), gdzie n = last first Uwaga: Przed wykonaniem algorytmu zakres [first, last) musi zawierać poprawny kopiec Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

64 Algorytmy przykład Przykład #include <vector> #include <algorithm> const int MAX = 9; using namespace std; int main(int argc, char* argv[]) { int tab[max] = {3, 5, 1, 4, 2, 9, 8, 6, 0}; vector<int> vi(tab, tab+max); ShowCollection(vi); // make_heap(vi.begin(), vi.end()); ShowCollection(vi); // pop_heap(vi.begin(), vi.end()); ShowCollection(vi); // *vi.rbegin() = 7; push_heap(vi.begin(), vi.end()); ShowCollection(vi); // } sort_heap(vi.begin(), vi.end()); ShowCollection(vi); // Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

65 Algorytmy lexicographical compare bool bool lexicographical_compare(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2) lexicographical_compare(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp) Działanie: Sprawdza czy elementy zakresu [first1, last1) są leksykograficznie mniejsze od elementów zakresu [first2, last2) Parametry: first1, last1, first2, last2 iteratory specyfikujące zakresy comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany zamiast operatora < jako relacja mniejszości Zwracana wartość: true jeśli pierwszy zakres zawiera elementy leksykograficznie mniejsze od elementów drugiego zakresu Złożoność: O(min(last1 first1, last2 first2)) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

66 Algorytmy matematyczne accumulate T accumulate(inputiterator first, InputIterator last, T init) Działanie: Wyznacza sumę wszystkich elementów zakresu [first, last) oraz wartości init Parametry: first, last iteratory specyfikujące zakres init wartość dodawana do sumy wszystkich elementów Zwracana wartość: Suma wszystkich elementów zakresu i wartości init Złożoność: O(last first) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

67 Algorytmy matematyczne accumulate T accumulate(inputiterator first, InputIterator last, T init) T accumulate(inputiterator first, InputIterator last, T init, BinaryOperation binary_op) Działanie: Oblicza wynik działania init = binary_op(init, *i) wykonywanego kolejno dla wszystkich elementów z zakresu [first, last) Parametry: first, last iteratory specyfikujące zakres init wartość początkowa binary_op predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) wykonywany zamiast sumowania elementów Zwracana wartość: Wynik działania predykatu binarnego dla kolejnych elementów Złożoność: O(last first) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

68 Algorytmy matematyczne inner product T inner_product(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, T init) Działanie: Oblicza wartość iloczynu skalarnego zakresu [first1, last1) oraz zakresu rozpoczynającego się od first2 powiększoną o wartość init Parametry: first1, last1, first2 iteratory specyfikujące zakresy init wartość dodawana do sumy wszystkich elementów zakresu Zwracana wartość: Wartość iloczynu skalarnego powiększona o init Złożoność: O(last1 first1) Uwaga: Brak kontroli zakresów (drugi zakres musi być dostatecznie duży) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

69 Algorytmy matematyczne inner product T inner_product(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, T init, BinaryOperation1 binary_op1, BinaryOperation2 binary_op2) Działanie: Oblicza wartość iloczynu skalarnego zakresu [first1, last1) oraz zakresu rozpoczynającego się od first2 powiększoną o wartość init przy czym zamiast operacji mnożenia elementów wykonywany jest binarny predykat binary_op2 a zamiast operacji dodawania wykonywany jest predykat binary_op1 Parametry: first1, last1, first2 iteratory specyfikujące zakresy init wartość dodawana do sumy wszystkich elementów zakresu binary_op1 binarny predykat wykonywany zamiast dodawania binary_op2 binarny predykat wykonywany zamiast mnożenia Zwracana wartość: Wartość iloczynu skalarnego powiększona o init Złożoność: O(last1 first1) Uwaga: Brak kontroli zakresów (drugi zakres musi być dostatecznie duży) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

70 Algorytmy matematyczne partial sum OutputIterator partial_sum(inputiterator first, InputIterator last, OutputIterator result) OutputIterator partial_sum(inputiterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op) Działanie: Oblicza sumy częściowe dla zakresu [first, last) a wyniki zapisuje do zakresu rozpoczynającego się od result, tj. i ty element zakresu docelowego zawiera sumę elementów od początkowego do i-tego z zakresu źródłowego Parametry: first, last, result iteratory specyfikujące zakresy binary_op binarny predykat (obiekt funkcyjny bądź wskaźnik na funkcję) wykonywany zamiast operacji dodawania Zwracana wartość: Iterator do pozycji za ostatnią z zakresu docelowego Złożoność: O(last first) Uwaga: Brak kontroli zakresów (drugi zakres musi być dostatecznie duży) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

71 Algorytmy matematyczne adjacent difference OutputIterator adjacent_difference(inputiterator first, InputIterator last, OutputIterator result) OutputIterator adjacent_difference(inputiterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op) Działanie: Dla każdego elementu z zakresu [first, last) oblicza różnicę między tym elementem i elementem poprzednim, a wynik zapisuje do zakresu docelowego rozpoczynającego się od result. Ponieważ pierwszy element nie ma poprzednika, to jest on kopiowany do zakresu docelowego Parametry: first, last, result iteratory specyfikujące zakresy binary_op binarny predykat (obiekt funkcyjny bądź wskaźnik na funkcję) wykonywany zamiast operacji odejmowania Zwracana wartość: Iterator do pozycji za ostatnią z zakresu docelowego Złożoność: O(last first) Uwaga: Brak kontroli zakresów (drugi zakres musi być dostatecznie duży) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

72 Plan wykładu 1 Iteratory Funkcje pomocnicze iteratorów Iteratory odwrotne Iteratory wstawiające Iteratory strumieniowe 2 Algorytmy Algorytmy modyfikujące Algorytmy sortowania i pochodne Algorytmy zbiorowe Algorytmy kopcowe Algorytmy inne Algorytmy matematyczne 3 Kolekcje niestandardowe SGI STL, STLPort, Borland C++ Builder 6+ MS Visual C++ C++ TR1 Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe / 83

Część 4 życie programu

Część 4 życie programu 1. Struktura programu c++ Ogólna struktura programu w C++ składa się z kilku części: część 1 część 2 część 3 część 4 #include int main(int argc, char *argv[]) /* instrukcje funkcji main */ Część

Bardziej szczegółowo

Zaawansowane programowanie w języku C++ Biblioteka standardowa

Zaawansowane programowanie w języku C++ Biblioteka standardowa Zaawansowane programowanie w języku C++ Biblioteka standardowa Prezentacja jest współfinansowana przez Unię Europejską w ramach Europejskiego Funduszu Społecznego w projekcie pt. Innowacyjna dydaktyka

Bardziej szczegółowo

Algorytmy i Struktury Danych. Anna Paszyńska

Algorytmy i Struktury Danych. Anna Paszyńska Algorytmy i Struktury Danych Anna Paszyńska Tablica dynamiczna szablon Array Zbiory Zbiory template class Container {public: virtual ~Container() { }; virtual int Count() const = 0;

Bardziej szczegółowo

Algorytmy w C++ dla opornych!

Algorytmy w C++ dla opornych! Algorytmy w C++ dla opornych! 02.10.2011 Opracował: Krzysztof Rudlicki W-ce przewodniczący SKN TeamBit krudlicki@future-processing.com O czym będę przynudzał: O - Dlaczego będę przynudzał? O - Vector A

Bardziej szczegółowo

Kontenery, algorytmy

Kontenery, algorytmy Kontenery, algorytmy Zaawansowane biblioteki programistyczne Sebastian Deorowicz Politechnika Śląska 2008 10 23 Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008 10 23 1 / 84 Plan wykładu 1 Kontenery

Bardziej szczegółowo

STL Standardt Template Library (wprowadzenie)

STL Standardt Template Library (wprowadzenie) STL Standardt Template Library (wprowadzenie) Biblioteka standardowych szablonów na dzień dzisiejszy stanowi jedną z najpotężniejszych możliwości języka C++ Zawiera szablony klas ogólnego przeznaczenia

Bardziej szczegółowo

Programowanie komputerowe. Zajęcia 5

Programowanie komputerowe. Zajęcia 5 Programowanie komputerowe Zajęcia 5 Tablice wielowymiarowe Tablicę dwuwymiarową możemy deklarować statycznie: typ nazwa[rozmiar1][rozmiar2]; Ma ona elementy nazwa[i][j] dla i=0,,rozmiar1-1, j=0,...,rozmiar2-1.

Bardziej szczegółowo

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

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki Dariusz Brzeziński Politechnika Poznańska, Instytut Informatyki int getmax (int a, int b) { return (a > b? a : b); float getmax (float a, float b) { return (a > b? a : b); long getmax (long a, long b)

Bardziej szczegółowo

I - Microsoft Visual Studio C++

I - Microsoft Visual Studio C++ I - Microsoft Visual Studio C++ 1. Nowy projekt z Menu wybieramy File -> New -> Projekt -> Win32 Console Application w okienku Name: podajemy nazwę projektu w polu Location: wybieramy miejsce zapisu i

Bardziej szczegółowo

Język C++ wykład VIII

Język C++ wykład VIII Programowanie uzupełnienie notatek: dr Jerzy Białkowski 1 2 3 4 Obiektowość języka C++ ˆ Klasa (rozszerzenie struktury), obiekt instancją klasy, konstruktory i destruktory ˆ Enkapsulacja - kapsułkowanie,

Bardziej szczegółowo

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

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016 Wykład 9 28 kwiecień 2016 Java Collections Framework (w C++ Standard Template Library) Kolekcja (kontener) Obiekt grupujacy/przechowuj acy jakieś elementy (obiekty lub wartości). Przykładami kolekcji sa

Bardziej szczegółowo

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

Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.) Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.) Kontenery - - wektor vector - - lista list - - kolejka queue - - stos stack Kontener asocjacyjny map 2016-01-08 Bazy danych-1 W5 1 Kontenery W programowaniu

Bardziej szczegółowo

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

Podstawy programowania skrót z wykładów: Podstawy programowania skrót z wykładów: // komentarz jednowierszowy. /* */ komentarz wielowierszowy. # include dyrektywa preprocesora, załączająca biblioteki (pliki nagłówkowe). using namespace

Bardziej szczegółowo

Programowanie obiektowe i C++ dla matematyków

Programowanie obiektowe i C++ dla matematyków Programowanie obiektowe i C++ dla matematyków Bartosz Szreder szreder (at) mimuw... 22 XI 2011 Uwaga! Ponieważ już sobie powiedzieliśmy np. o wskaźnikach i referencjach, przez które nie chcemy przegrzebywać

Bardziej szczegółowo

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

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej Wykład II - semestr II Kierunek Informatyka Wydział Matematyki Stosowanej Politechniki Śląskiej Gliwice, 2015 c Copyright 2015 Janusz Słupik Operacje dyskowe - zapis do pliku #include #include

Bardziej szczegółowo

Biblioteka STL - wstęp. Biblioteka STL - literatura. Biblioteka STL - przegląd. Biblioteka STL - kwestie techniczne

Biblioteka STL - wstęp. Biblioteka STL - literatura. Biblioteka STL - przegląd. Biblioteka STL - kwestie techniczne Biblioteka STL - literatura Biblioteka STL - wstęp STL - Standard Template Library - Standardowa Biblioteka Szablonów Nicolai M. Josuttis - "C Biblioteka standardowa. Podręcznik programisty", Helion, 2003

Bardziej szczegółowo

Rekurencja. Przygotowała: Agnieszka Reiter

Rekurencja. Przygotowała: Agnieszka Reiter Rekurencja Przygotowała: Agnieszka Reiter Definicja Charakterystyczną cechą funkcji (procedury) rekurencyjnej jest to, że wywołuje ona samą siebie. Drugą cechą rekursji jest jej dziedzina, którą mogą być

Bardziej szczegółowo

Programowanie Komponentowe Zarządzanie obiektami: kontenery

Programowanie Komponentowe Zarządzanie obiektami: kontenery Programowanie Komponentowe Zarządzanie obiektami: kontenery dr inż. Ireneusz Szcześniak jesień 2016 roku Kontenery Kontener w C++ to generyczna struktura danych. Przechowuje elementy jednego dowolnego

Bardziej szczegółowo

Algorytmy i Struktury Danych.

Algorytmy i Struktury Danych. Algorytmy i Struktury Danych. Standard Template Library. Część 1. Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 6 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych.

Bardziej szczegółowo

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

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec PROE wykład 3 klasa string, przeciążanie funkcji, operatory dr inż. Jacek Naruniec Przypomnienie z ostatnich wykładów Konstruktory/destruktory i kolejność ich wywołania w złożonej klasie. Referencja Obiekty

Bardziej szczegółowo

Paradygmaty programowania

Paradygmaty programowania Paradygmaty programowania Programowanie generyczne w C++ Dr inż. Andrzej Grosser Cz estochowa, 2014 2 Spis treści 1. Zadanie 4 5 1.1. Wprowadzenie.................................. 5 1.2. Wskazówki do

Bardziej szczegółowo

Operatory na rzecz typu TString

Operatory na rzecz typu TString Operatory na rzecz typu TString Dopiszmy w definicji klasy operator[], dzięki któremu potraktujemy obiekt jak tablicę class TString { public: char& operator[]( size_t n ); const char& operator[]( size_t

Bardziej szczegółowo

Jak Windows zarządza pamięcią?

Jak Windows zarządza pamięcią? Jak Windows zarządza pamięcią? System Windows definiuje dwa typy pamięci, często mylone przez użytkowników. Pamięć fizyczna (pamięc RAM zainstalowana w komputerze) Pamięć widziana przez daną aplikację

Bardziej szczegółowo

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

Wydajność użycia funktorów z biblioteką STL języka C++ Wydajność użycia funktorów z biblioteką STL języka C++ Irek Szcześniak, Maciek Sobczak 1 października 2005 roku Streszczenie Artykuł dotyczy wydajności użycia funktorów z biblioteką STL (Standard Template

Bardziej szczegółowo

Zaawansowane programowanie w C++ (PCP)

Zaawansowane programowanie w C++ (PCP) Wykład 8 - biblioteka standardowa. Kolekcje i iteratory 27 kwietnia 2007 Powtórzenie - sprytne wskaźniki Zalety: upraszczają zarządzanie obiektami na stercie Wady: narzuty Sprytne wskaźniki dostępne w

Bardziej szczegółowo

Szablony funkcji i szablony klas

Szablony funkcji i szablony klas Bogdan Kreczmer bogdan.kreczmer@pwr.wroc.pl Zakład Podstaw Cybernetyki i Robotyki Instytut Informatyki, Automatyki i Robotyki Politechnika Wrocławska Kurs: Copyright c 2011 Bogdan Kreczmer Niniejszy dokument

Bardziej szczegółowo

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

Pojemniki Pojemnik to obiekt, którego zadaniem jest przechowywanie innych obiektów. 1 Wstęp Biblioteka standardowa C++ Wejście/wyjście (iostream) Napisy (string) Napisy jako strumienie (sstream) STL Standard Template Library Pojemniki (kolekcje) Iteratory (wyliczanie elementów) Algorytmy

Bardziej szczegółowo

Programowanie w języku C++

Programowanie w języku C++ Programowanie w języku C++ Część siódma Autor Roman Simiński Kontakt roman.siminski@us.edu.pl www.us.edu.pl/~siminski Niniejsze opracowanie zawiera skrót treści wykładu, lektura tych materiałów nie zastąpi

Bardziej szczegółowo

PARADYGMATY PROGRAMOWANIA Wykład 3

PARADYGMATY PROGRAMOWANIA Wykład 3 PARADYGMATY PROGRAMOWANIA Wykład 3 Definiowanie operatorów i ich przeciążanie Przykłady zastosowania operatorów: a) operator podstawienia ( = ) obiektów o złożonej strukturze, b) operatory działania na

Bardziej szczegółowo

dr inż. Jarosław Forenc

dr inż. Jarosław Forenc Informatyka 2 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr III, studia niestacjonarne I stopnia Rok akademicki 2011/2012 Pracownia nr 9 (20.01.2012) dr inż. Jarosław Forenc Rok

Bardziej szczegółowo

Szablony klas, zastosowanie szablonów w programach

Szablony klas, zastosowanie szablonów w programach Szablony klas, zastosowanie szablonów w programach 1. Szablony klas i funkcji 2. Szablon klasy obsługującej uniwersalną tablicę wskaźników 3. Zastosowanie metody zwracającej przez return referencję do

Bardziej szczegółowo

Język ludzki kod maszynowy

Język ludzki kod maszynowy Język ludzki kod maszynowy poziom wysoki Język ludzki (mowa) Język programowania wysokiego poziomu Jeśli liczba punktów jest większa niż 50, test zostaje zaliczony; w przeciwnym razie testu nie zalicza

Bardziej szczegółowo

Języki i techniki programowania Ćwiczenia 2

Języki i techniki programowania Ćwiczenia 2 Języki i techniki programowania Ćwiczenia 2 Autor: Marcin Orchel Spis treści: Język C++... 5 Przekazywanie parametrów do funkcji... 5 Przekazywanie parametrów w Javie.... 5 Przekazywanie parametrów w c++...

Bardziej szczegółowo

Zadania z podstaw programowania obiektowego

Zadania z podstaw programowania obiektowego Zadania z podstaw programowania obiektowego 1. Napisać klasę Lista, której zadaniem będzie przechowywanie listy liczb całkowitych. Klasa ta ma mieć następujące pola prywatne: int* liczby; tablica, w której

Bardziej szczegółowo

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

Języki Programowania. Prowadząca: dr inż. Hanna Zbroszczyk.   tel: Konsultacje: piątek: Języki Programowania Prowadząca: dr inż. Hanna Zbroszczyk e-mail: gos@if.pw.edu.pl tel: +48 22 234 58 51 Konsultacje: piątek: 12.00 13.30 www: http://www.if.pw.edu.pl/~gos/students/jp Politechnika Warszawska

Bardziej szczegółowo

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

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne Tematyka wykładów 1. Wprowadzenie. Klasy cz. 1 - Język C++. Programowanie obiektowe - Klasy i obiekty - Budowa i deklaracja klasy. Prawa dostępu - Pola i funkcje składowe - Konstruktor i destruktor - Tworzenie

Bardziej szczegółowo

wykład V uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ - klasy

wykład V uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ - klasy i obiekty Programowanie i obiekty uzupełnienie notatek: dr Jerzy Białkowski i obiekty 1 2 3 4 i obiekty Obiektowość języka C++ Na tym wykładzie poznamy: ˆ Klasa (w języku C++ rozszerzenie struktury, typ

Bardziej szczegółowo

Kontenery i iteratory. Wykorzystanie kontenerów w praktyce.

Kontenery i iteratory. Wykorzystanie kontenerów w praktyce. Instrukcja laboratoryjna nr 2 Programowanie w języku C 2 (C++ poziom zaawansowany) Kontenery i iteratory. Wykorzystanie kontenerów w praktyce. dr inż. Jacek Wilk-Jakubowski mgr inż. Maciej Lasota dr inż.

Bardziej szczegółowo

8. Wektory. Przykłady Napisz program, który pobierze od użytkownika 10 liczb, a następnie wypisze je w kolejności odwrotnej niż podana.

8. Wektory. Przykłady Napisz program, który pobierze od użytkownika 10 liczb, a następnie wypisze je w kolejności odwrotnej niż podana. 8. Wektory Przykłady 8.1. Napisz program, który pobierze od użytkownika 10 liczb, a następnie wypisze je w kolejności odwrotnej niż podana. Uwaga! Kod poniżej. To zadanie można rozwiązać przy użyciu wiedzy

Bardziej szczegółowo

jest mocny, skoro da się w nim wyrazić nowe pojęcia; łatwiej przenieść go na nową platformę jest mniejszy.

jest mocny, skoro da się w nim wyrazić nowe pojęcia; łatwiej przenieść go na nową platformę jest mniejszy. Wejście-wyjście Nie jest elementem języka C++ Niezbyt istotne dla użytkownika, ważne dla języka: jest mocny, skoro da się w nim wyrazić nowe pojęcia; łatwiej przenieść go na nową platformę jest mniejszy.

Bardziej szczegółowo

STL Standard Template Library

STL Standard Template Library Literatura Przykłady: STL Standard Template Library Nicolai M. Josuttis: C++ Standard Library: A tutorial and Reference, 1st, Pearson 1999, (Polska wersja: Nicolai M. Josuttis: C++ Biblioteka standardowa

Bardziej szczegółowo

Podstawowe algorytmy i ich implementacje w C. Wykład 9

Podstawowe algorytmy i ich implementacje w C. Wykład 9 Wstęp do programowania 1 Podstawowe algorytmy i ich implementacje w C Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 9 Element minimalny i maksymalny zbioru Element minimalny

Bardziej szczegółowo

Wstęp do programowania

Wstęp do programowania Wstęp do programowania Algorytmy na tablicach Paweł Daniluk Wydział Fizyki Jesień 2013 P. Daniluk (Wydział Fizyki) WP w. III Jesień 2013 1 / 23 Dwadzieścia pytań Zasady 1 Osoba 1 wymyśla hasło z ustalonej

Bardziej szczegółowo

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

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006) Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006) Część 1. Teoria Wyjaśnij pojęcia, podaj przykład: klasa obiekt konstruktor destruktor kapsułkowanie (hermetyzacja) wskaźnik this

Bardziej szczegółowo

Podstawy Programowania

Podstawy Programowania Podstawy Programowania dr Elżbieta Gawrońska gawronska@icis.pcz.pl Instytut Informatyki Teoretycznej i Stosowanej dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 05 1 / 15 Plan wykładu 1 Biblioteka

Bardziej szczegółowo

Język C++ część 9 szablony klas. Jarosław Gramacki Instytut Informatyki i Elektroniki. szablony funkcji

Język C++ część 9 szablony klas. Jarosław Gramacki Instytut Informatyki i Elektroniki. szablony funkcji Język C++ część 9 szablony klas Jarosław Gramacki Instytut Informatyki i Elektroniki szablony funkcji były omawiane na wcześniejszym wykładzie nazewnictwo: szablon funkcji wzorzec funkcji 2 szablony

Bardziej szczegółowo

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

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej Wykład I - semestr II Kierunek Informatyka Wydział Matematyki Stosowanej Politechniki Śląskiej Gliwice, 2015 c Copyright 2015 Janusz Słupik Zaliczenie przedmiotu Do zaliczenia przedmiotu niezbędne jest

Bardziej szczegółowo

do instrukcja while (wyrażenie);

do instrukcja while (wyrażenie); Instrukcje pętli -ćwiczenia Instrukcja while Pętla while (póki) powoduje powtarzanie zawartej w niej sekwencji instrukcji tak długo, jak długo zaczynające pętlę wyrażenie pozostaje prawdziwe. while ( wyrażenie

Bardziej szczegółowo

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016 Wykład 2 17 marca 2016 Dziedziczenie Klasy bazowe i potomne Dziedziczenie jest łatwym sposobem rozwijania oprogramowania. Majac klasę bazowa możemy ja uszczegółowić (dodać nowe pola i metody) nie przepisujac

Bardziej szczegółowo

Programowanie komputerowe. Zajęcia 1

Programowanie komputerowe. Zajęcia 1 Programowanie komputerowe Zajęcia 1 Code::Blocks - tworzenie projektu Create New Project Console Application -> C++ Wybierz nazwę projektu Stworzy się nowy projekt z wpisaną funkcją main Wpisz swój program

Bardziej szczegółowo

Definicja szablonu klasy. Korzystanie z szablonu. Specjalizacja metody szablonu.

Definicja szablonu klasy. Korzystanie z szablonu. Specjalizacja metody szablonu. class Wektor private: Typ x; Typ y; Wektor(Typ a, Typ b) :x(a), y(b) ; Wektor A(2, 5); Wektor B(2.7, 9.7); Wektor C('A', 'B'); 1 Definicja szablonu klasy. Korzystanie z szablonu. class

Bardziej szczegółowo

Zaawansowane programowanie w C++ (PCP)

Zaawansowane programowanie w C++ (PCP) Zaawansowane programowanie w C++ (PCP) Wykład 6 - szablony. dr inż. Robert Nowak - p. 1/15 Kolekcje i algorytmy» Deklaracja szablonu y Pojęcia niezależne od typu: kolekcje (np. listy) algorytmy (np. znajdowania

Bardziej szczegółowo

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

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej Podstawy informatyki Informatyka stosowana - studia niestacjonarne Grzegorz Smyk Wydział Inżynierii Metali i Informatyki Przemysłowej Akademia Górniczo Hutnicza im. Stanisława Staszica w Krakowie, rok

Bardziej szczegółowo

Programowanie w języku C++

Programowanie w języku C++ INE 2022 JĘZYKI PROGRAMOWANIA 1 INE 0050 WSTĘP DO PROGRAMOWANIA Programowanie w języku C++ ( wykł. dr Marek Piasecki ) Literatura: do wykładu dowolny podręcznik do języka C++ na laboratoriach Borland C++

Bardziej szczegółowo

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI Dr inż. Grażyna KRUPIŃSKA Grazyna.Krupinska@fis.agh.edu.pl D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI Wyrażenia 2 Wyrażenia w języku C są bardziej elastyczne niż wyrażenia w jakimkolwiek innym języku

Bardziej szczegółowo

Wzorce funkcji (szablony)

Wzorce funkcji (szablony) Wzorce funkcji (szablony) Wzorce funkcji (ang. function template) dają możliwość wielokrotnego wykorzystywania tego samego kodu funkcji dla różnych typów danych. Załóżmy, że chcemy zdefiniować funkcję

Bardziej szczegółowo

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

Dla każdej operacji łącznie tworzenia danych i zapisu ich do pliku przeprowadzić pomiar czasu wykonania polecenia. Wyniki przedstawić w tabelce. Przygotować program tworzący tablicę dwuwymiarową zawierającą zestawy 10 2, 10 4, 10 6 liczb losowych zmiennoprzecinkowych. Korzystając z funkcji bibliotecznych uporządkować zawartość każdego (a) wiersza

Bardziej szczegółowo

Programowanie w językach

Programowanie w językach Programowanie w językach wysokiego poziomu Obsługa plików za pomocą strumieni Elektronika i Telekomunikacja, semestr III rok akademicki 2013/2014 dr inż. Paweł Myszkowski Plan zajęć a) otwieranie i zamykanie

Bardziej szczegółowo

Projektowanie klas c.d. Projektowanie klas przykład

Projektowanie klas c.d. Projektowanie klas przykład Projektowanie klas c.d. ogólne wskazówki dotyczące projektowania klas: o wyodrębnienie klasy odpowiedź na potrzeby życia (obsługa rozwiązania konkretnego problemu) o zwykle nie uda się utworzyć idealnej

Bardziej szczegółowo

Programowanie obiektowe w C++ Wykład 12

Programowanie obiektowe w C++ Wykład 12 Programowanie obiektowe w C++ Wykład 12 dr Lidia Stępień Akademia im. Jana Długosza w Częstochowie L. Stępień (AJD) 1 / 22 Zakresowe pętle for double tab[5] {1.12,2.23,3.33,4.12,5.22 for(double x: tab)

Bardziej szczegółowo

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis i cz. 2 Programowanie uzupełnienie notatek: dr Jerzy Białkowski 1 i cz. 2 2 i cz. 2 3 Funkcje i cz. 2 typ nazwa ( lista-parametrów ) { deklaracje instrukcje } i cz. 2 typ nazwa ( lista-parametrów ) { deklaracje

Bardziej szczegółowo

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

Język C++ Różnice między C a C++ Język C++ Różnice między C a C++ Plan wykładu C a C++ Różnice ogólne Typy Deklaracje zmiennych C++ jako rozszerzenie C Domyślne argumenty funkcji Przeciążanie funkcji Referencje Dynamiczny przydział pamięci

Bardziej szczegółowo

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta 16.09.2006. Strona 1 z 26. Powrót. Full Screen. Zamknij.

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta 16.09.2006. Strona 1 z 26. Powrót. Full Screen. Zamknij. Programowanie Sobera Jolanta 16.09.2006 Strona 1 z 26 1 Wprowadzenie do programowania 4 2 Pierwsza aplikacja 5 3 Typy danych 6 4 Operatory 9 Strona 2 z 26 5 Instrukcje sterujące 12 6 Podprogramy 15 7 Tablice

Bardziej szczegółowo

Zaprojektować i zaimplementować algorytm realizujący następujące zadanie.

Zaprojektować i zaimplementować algorytm realizujący następujące zadanie. Lista 1 Utworzenie tablicy jest równoznaczne z alokacją pamięci na elementy tablicy (utworzeniem dynamicznej tablicy). W zadaniach należy pamiętać o zwolnieniu zasobów przydzielonych na stercie. Zabronione

Bardziej szczegółowo

Zadania do wykonania. Rozwiązując poniższe zadania użyj pętlę for.

Zadania do wykonania. Rozwiązując poniższe zadania użyj pętlę for. Zadania do wykonania Rozwiązując poniższe zadania użyj pętlę for. 1. apisz program, który przesuwa w prawo o dwie pozycje zawartość tablicy 10-cio elementowej liczb całkowitych tzn. element t[i] dla i=2,..,9

Bardziej szczegółowo

void Pobierz(Student &a); void Wypisz(Student a); void Ustaw_zaliczenia(Student t[],int r); void Wypisz_najlepszych(Student t[],int r, float prog);

void Pobierz(Student &a); void Wypisz(Student a); void Ustaw_zaliczenia(Student t[],int r); void Wypisz_najlepszych(Student t[],int r, float prog); Program 19 Zadeklarować strukturę Student o polach: Imie, Nazwisko (ciągi znaków), Oceny (pięcioelementowa tablica wartości rzeczywistych reprezentujących oceny studenta) i Semestr_zaliczony (wartość logiczna

Bardziej szczegółowo

10.1 Szablony... 1 10.2 Szablony funkcji... 2 10.3 Szablony klas... 5 10.4 Szablony jako wstęp do biblioteki STL... 10

10.1 Szablony... 1 10.2 Szablony funkcji... 2 10.3 Szablony klas... 5 10.4 Szablony jako wstęp do biblioteki STL... 10 .1 Szablony... 1.2 Szablony funkcji... 2.3 Szablony klas....4 Szablony jako wstęp do biblioteki STL....1 Szablony Szablony definiują sparametryzowane rodziny klas, funkcji. Szablony deklarujemy i definiujemy

Bardziej szczegółowo

STL Standard Template Library

STL Standard Template Library ź ź STL Standard Template Library STL jest bibliotek kontenerów, algorytmów, iteratorów i wielu innych powszechnie u ywanych udogodnie programistycznych. STL jest wbudowany w standard j zyka C++, umo liwia

Bardziej szczegółowo

Zajęcia 6 wskaźniki i tablice dynamiczne

Zajęcia 6 wskaźniki i tablice dynamiczne Zajęcia 6 wskaźniki i tablice dynamiczne 1. Napisz funkcję void zamien(int *a, int *b), która otrzymuje wskaźniki dwóch zmiennych typu całkowitego, a następnie dokonuje zamiany wartości wskazywanych zmiennych.

Bardziej szczegółowo

Kontenery. Wykład 12. Programowanie (język C++) Rodzaje kontenerów. Przegląd kontenerów

Kontenery. Wykład 12. Programowanie (język C++) Rodzaje kontenerów. Przegląd kontenerów Programowanie (język C) Kontenery Wykład 12. Tomasz Marks - Wydział MiNI PW -1- Tomasz Marks - Wydział MiNI PW -2- Rodzaje kontenerów Kontenery sekwencyjne kolekcje uporządkowane, w których kaŝdy element

Bardziej szczegółowo

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16 M. Trzebiński C++ 1/16 Podstawy języka C++ Maciej Trzebiński Instytut Fizyki Jądrowej Polskiej Akademii Nauk Praktyki studenckie na LHC IFJ PAN 6lipca2015 Uruchomienie maszyny w CC1 M. Trzebiński C++ 2/16

Bardziej szczegółowo

TEMAT : KLASY DZIEDZICZENIE

TEMAT : KLASY DZIEDZICZENIE TEMAT : KLASY DZIEDZICZENIE Wprowadzenie do dziedziczenia w języku C++ Język C++ możliwa tworzenie nowej klasy (nazywanej klasą pochodną) w oparciu o pewną wcześniej zdefiniowaną klasę (nazywaną klasą

Bardziej szczegółowo

PARADYGMATY PROGRAMOWANIA Wykład 4

PARADYGMATY PROGRAMOWANIA Wykład 4 PARADYGMATY PROGRAMOWANIA Wykład 4 Metody wirtualne i polimorfizm Metoda wirualna - metoda używana w identyczny sposób w całej hierarchii klas. Wybór funkcji, którą należy wykonać po wywołaniu metody wirtualnej

Bardziej szczegółowo

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami 1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami Celem tych zajęć jest zrozumienie i oswojenie z technikami programowania przy pomocy wskaźników w języku C++. Proszę przeczytać rozdział 8.

Bardziej szczegółowo

Podstawy programowania w języku C++

Podstawy programowania w języku C++ Podstawy programowania w języku C++ Część dziewiąta Tablice a zmienne wskaźnikowe Wersja skrócona, tylko C++ Autor Roman Simiński Kontakt roman.siminski@us.edu.pl www.us.edu.pl/~siminski Niniejsze opracowanie

Bardziej szczegółowo

Rzutowanie i konwersje

Rzutowanie i konwersje Rzutowanie i konwersje Bogdan Kreczmer ZPCiR IIAiR PWr pokój 307 budynek C3 bogdan.kreczmer@pwr.wroc.pl Copyright c 2005 2013 Bogdan Kreczmer Niniejszy dokument zawiera materiały do wykładu na temat programowania

Bardziej szczegółowo

TEMAT : KLASY POLIMORFIZM

TEMAT : KLASY POLIMORFIZM TEMAT : KLASY POLIMORFIZM 1. Wprowadzenie do polimorfizmu i funkcji wirtualnych w języku C++ Język C++ zakłada, że w pewnych przypadkach uzasadnione jest tworzenie klas, których reprezentanci w programie

Bardziej szczegółowo

Podstawy Programowania Obiektowego

Podstawy Programowania Obiektowego Podstawy Programowania Obiektowego Pojęcie struktury i klasy. Konstruktor i destruktor. Spotkanie 08 Dr inż. Dariusz JĘDRZEJCZYK Tematyka wykładu Spotkanie 08 Klasy: definicja a deklaracja klasy dane składowe

Bardziej szczegółowo

Programowanie Obiektowe i C++

Programowanie Obiektowe i C++ Programowanie Obiektowe i C++ Marcin Benke Instytut Informatyki UW 13.11.2006 Marcin Benke (IIUW) Programowanie Obiektowe i C++ 13.11.2006 157 / 201 Wejście-wyjście Nie jest elementem języka C++ Niezbyt

Bardziej szczegółowo

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

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy) Rok akademicki 2012/2013, Wykład nr 2 2/25 Plan wykładu nr 2 Informatyka 2 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr III, studia niestacjonarne I stopnia Rok akademicki 2012/2013

Bardziej szczegółowo

Zaawansowany kurs języka Python

Zaawansowany kurs języka Python Wykład 4. 23 października 2015 Plan wykładu 1 2 Pliki tekstowe Trwałość obiektów CSV Strumienie Plan wykładu 1 2 Pliki tekstowe Trwałość obiektów CSV Strumienie Protokół iteracyjny Producent Umiem dostarczać

Bardziej szczegółowo

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

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

Bardziej szczegółowo

Złożoność obliczeniowa zadania, zestaw 2

Złożoność obliczeniowa zadania, zestaw 2 Złożoność obliczeniowa zadania, zestaw 2 Określanie złożoności obliczeniowej algorytmów, obliczanie pesymistycznej i oczekiwanej złożoności obliczeniowej 1. Dana jest tablica jednowymiarowa A o rozmiarze

Bardziej szczegółowo

Podstawy programowania. 1. Operacje arytmetyczne Operacja arytmetyczna jest opisywana za pomocą znaku operacji i jednego lub dwóch wyrażeń.

Podstawy programowania. 1. Operacje arytmetyczne Operacja arytmetyczna jest opisywana za pomocą znaku operacji i jednego lub dwóch wyrażeń. Podstawy programowania Programowanie wyrażeń 1. Operacje arytmetyczne Operacja arytmetyczna jest opisywana za pomocą znaku operacji i jednego lub dwóch wyrażeń. W językach programowania są wykorzystywane

Bardziej szczegółowo

Algorytmy i język C++

Algorytmy i język C++ Wykład 6 Wskaźniki Wskaźnik nie przechowuje wartości zmiennej ale, podobnie jak tablica, wskazuje miejsce w pamięci, w którym znajduje się zmienna danego typu. W poniższym przykładzie symbol * pomiędzy

Bardziej szczegółowo

Zwracanie obiektu. Funkcja może zwracać obiekty: #include"stdafx.h #include using namespace std; class samp { inti; public:

Zwracanie obiektu. Funkcja może zwracać obiekty: #includestdafx.h #include <iostream> using namespace std; class samp { inti; public: Zwracanie obiektu Funkcja może zwracać obiekty: #include"stdafx.h #include using namespace std; class samp ; inti; samp(char *title); voidset_i(intii) i = ii; intget_i() return i; ~samp(); samp::samp(char

Bardziej szczegółowo

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

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych. Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych. 1. Rodzaje pamięci używanej w programach Pamięć komputera, dostępna dla programu,

Bardziej szczegółowo

Wprowadzenie do programowania i programowanie obiektowe

Wprowadzenie do programowania i programowanie obiektowe Wprowadzenie do programowania i programowanie obiektowe Wirtotechnologia Zajęcia nr 10 autor: Grzegorz Smyk Wydział Odlewnictwa Wydział Inżynierii Metali i Informatyki Przemysłowej Akademia Górniczo Hutnicza

Bardziej szczegółowo

Listy i funkcje zaprzyjaźnione w C++

Listy i funkcje zaprzyjaźnione w C++ Listy i funkcje zaprzyjaźnione w C++ Na ostatnich zajęciach zajmowaliśmy się obsługą gniazdek w systemie Windows. Zajęcia te były w całości realizowane w aplikacji konsolowej. Takie podejście znaczenie

Bardziej szczegółowo

Drzewa wyszukiwań binarnych (BST)

Drzewa wyszukiwań binarnych (BST) Drzewa wyszukiwań binarnych (BST) Krzysztof Grządziel 12 czerwca 2007 roku 1 Drzewa Binarne Drzewa wyszukiwań binarnych, w skrócie BST (od ang. binary search trees), to szczególny przypadek drzew binarnych.

Bardziej szczegółowo

Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011 Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011 Załóżmy, że uprawiamy jogging i chcemy monitorować swoje postępy. W tym celu napiszemy program, który zlicza, ile czasu

Bardziej szczegółowo

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class). Wprowadzenie w dziedziczenie Klasa D dziedziczy klasę B: B klasa bazowa D klasa pochodna Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class). Najpierw jest tworzona klasa bazowa,

Bardziej szczegółowo

Wyjątki (exceptions)

Wyjątki (exceptions) Instrukcja laboratoryjna nr 6 Programowanie w języku C 2 (C++ poziom zaawansowany) Wyjątki (exceptions) dr inż. Jacek Wilk-Jakubowski mgr inż. Maciej Lasota dr inż. Tomasz Kaczmarek Wstęp Wyjątki (ang.

Bardziej szczegółowo

Java Collections Framework

Java Collections Framework Java Collections Framework Co to jest Java Collections Framework JCF Zunifikowana architektura do reprezentacji i manipulacji kolekcjami danych. Składa się z: Interfejsów Definuje abstrakcyjne typy możliwych

Bardziej szczegółowo

Wstęp do wskaźników w języku ANSI C

Wstęp do wskaźników w języku ANSI C Wstęp do wskaźników w języku ANSI C / Materiał dydaktyczny pomocniczy do przedmiotu Informatyka sem.iii kier. Elektrotechnika/ 1. Wprowadzenie W języku ANSI C dla każdego typu X (wbudowanego, pochodnego,

Bardziej szczegółowo

Wykład 9 2014-06-20 09:37 PP2_W9

Wykład 9 2014-06-20 09:37 PP2_W9 Wykład 9 Przykłady programów z wykorzystaniem klas - przykład funkcji operatorowych - obiektowa implementacja listy jednokierunkowej kopiowanie obiektów - klasa "latający napis" Pozycjonowanie w plikach

Bardziej szczegółowo

Jzyk C++ cz 3. Jarosław Gramacki Instytut Informatyki i Elektroniki ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2" ( $%%) )'20 )*0) 1 / )

Jzyk C++ cz 3. Jarosław Gramacki Instytut Informatyki i Elektroniki ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2 ( $%%) )'20 )*0) 1 / ) Jzyk C++ cz 3 Jarosław Gramacki Instytut Informatyki i Elektroniki # $$%%& ' ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2" ( $%%) )'20 )*0) 1 / )!" 2 # $$%%& ' ( $%%/,))3 ( %* 2 / 4 ( ( *' *''*,

Bardziej szczegółowo

PROGRAMOWANIE GENERYCZNE W JĘZYKU C++

PROGRAMOWANIE GENERYCZNE W JĘZYKU C++ PROGRAMOWANIE GENERYCZNE W JĘZYKU C++ Krzysztof Rogala Instytu Automatyki i Informatyki Stosowanej Wydział Elektroniki i Technik Informacyjnych Politechniki Warszawskiej CZYM JEST PROGRAMOWANIE GENERYCZNE?

Bardziej szczegółowo

1 P roste e t ypy p d a d n a ych c - c ąg ą g d a d l a szy 2 T y T py p z ł z o ł żo ż ne e d a d n a ych c : T BLICE

1 P roste e t ypy p d a d n a ych c - c ąg ą g d a d l a szy 2 T y T py p z ł z o ł żo ż ne e d a d n a ych c : T BLICE 1. Proste typy danych- ciąg dalszy 2. Typy złożone danych : TABLICE Wykład 3 ZMIENNE PROSTE: TYPY WBUDOWANE Typy zmiennoprzecinkowe: float double long double Różne rozmiary bajtowe. W konsekwencji różne

Bardziej szczegółowo