Kontenery, algorytmy - Politechnika Śląska
Transkrypt
Kontenery, algorytmy - Politechnika Śląska
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 sekwencyjne Kontener deque Adaptatory kontenerów Adaptator kontenera queue Adaptator kontenera stack Adaptator kontenera priority queue 2 Kontenery asocjacyjne Klasa pair Kontener set Kontener multiset Kontener bitset Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 2 / 84 Plan wykładu 1 Kontenery sekwencyjne Kontener deque Adaptatory kontenerów Adaptator kontenera queue Adaptator kontenera stack Adaptator kontenera priority queue 2 Kontenery asocjacyjne Klasa pair Kontener set Kontener multiset Kontener bitset Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 3 / 84 Kontener deque Czym jest kontener deque?1 Kontener sekwencyjny Podobny do kontenera vector w tym, że wspiera bezpośredni dostęp do elementów a czas wstawiania i usuwania elementów ze środka jest liniowy Podobny do kontenera list w tym, że czas wstawiania i usuwania elementów z początku i końca jest stały 1 Dostępna w pliku nagłówkowym deque Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 4 / 84 Kontener deque Konstruktory Analogiczne jak w list i vector Przypisania Metody assign analogiczne jak w list i vector Operator przypisania również analogiczny Metody zwracające iteratory Dostępne metody begin, end, rbegin, rend zwracające iteratory o takim samym znaczeniu jak w innych kontenerach sekwencyjnych Metody związane z rozmiarem Dostępne metody size, max size, resize, empty o takim samym znaczeniu jak w innych kontenerach sekwencyjnych Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 5 / 84 Kontener deque — dostęp swobodny do elementów reference operator[](size_type n) const_reference operator[](size_type n) const Działanie: Zwraca referencję (stałą referencję) do n-tego elementu kontenera Parametr: n — numer elementu Zwracana wartość: Referencja (stała referencja) do elementu Złożoność: O(1) Uwaga: Brak kontroli zakresu, więc możliwe zachowanie niezdefiniowane jeśli podany błędny indeks Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 6 / 84 Kontener deque — dostęp swobodny do elementów reference at(size_type n) const_reference at(size_type n) const Działanie: Zwraca referencję (stałą referencję) do n-tego elementu kontenera Parametr: n — numer elementu Zwracana wartość: Referencja (stała referencja) do elementu Złożoność: O(1) Uwaga: Kontrola zakresu, więc jeśli podany błędny indeks to generuje wyjątek out_of_range Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 7 / 84 Kontener deque — dostęp swobodny do elementów reference front() const_reference front() const reference back() const_reference back() const Działanie: Zwraca referencję (stałą referencję) do pierwszego (ostatniego) elementu kontenera Parametry: brak Zwracana wartość: Referencja (stała referencja) do elementu kontenera Złożoność: O(1) Uwaga: Brak kontroli zakresu, więc jeśli kontener jest pusty to zachowanie niezdefiniowane Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 8 / 84 Kontener deque — operacje na końcach void push_front(const T& x) void push_back(const T& x) Działanie: Dodaje element na początek (koniec) kontenera Parametr: x — wstawiany element Zwracana wartość: brak Złożoność: O(1) void pop_front() void pop_back() Działanie: Usuwa element z początku (końca) kontenera Parametry: brak Zwracana wartość: brak Złożoność: O(1) Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 9 / 84 Kontener deque — wstawianie i usuwanie elementów Wstawianie elementów Dostępne 3 metody insert o identycznych parametrach i działaniu jak dla kontenera vector i list Złożoność: O(n), gdzie n to rozmiar kontenera Usuwanie elementów Dostępne 2 metody erase o identycznych parametrach i działaniu jak dla kontenera vector i list Złożoność: O(n), gdzie n to rozmiar kontenera Inne Metoda clear identyczna jak dla innych kontenerów (złożoność O(n)) Metoda swap identyczna jak dla innych kontenerów (złożoność O(1)) Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 10 / 84 Kontener deque — wstawianie i usuwanie elementów Wstawianie elementów Dostępne 3 metody insert o identycznych parametrach i działaniu jak dla kontenera vector i list Złożoność: O(n), gdzie n to rozmiar kontenera Usuwanie elementów Dostępne 2 metody erase o identycznych parametrach i działaniu jak dla kontenera vector i list Złożoność: O(n), gdzie n to rozmiar kontenera Inne Metoda clear identyczna jak dla innych kontenerów (złożoność O(n)) Metoda swap identyczna jak dla innych kontenerów (złożoność O(1)) Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 10 / 84 Kontener deque — wstawianie i usuwanie elementów Wstawianie elementów Dostępne 3 metody insert o identycznych parametrach i działaniu jak dla kontenera vector i list Złożoność: O(n), gdzie n to rozmiar kontenera Usuwanie elementów Dostępne 2 metody erase o identycznych parametrach i działaniu jak dla kontenera vector i list Złożoność: O(n), gdzie n to rozmiar kontenera Inne Metoda clear identyczna jak dla innych kontenerów (złożoność O(n)) Metoda swap identyczna jak dla innych kontenerów (złożoność O(1)) Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 10 / 84 Kontener deque — przykład Przykład # include < deque > using namespace std ; const int MAX = 10; int main ( int argc , char * argv []) { int tab [ MAX ] = {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10}; deque < int > di ( tab , tab +5); ShowC ollection ( di ); // 1 2 3 4 5 di . insert ( di . begin ()+3 , tab +7 , tab +10); ShowC ollection ( di ); // 1 2 3 8 9 di . pop_front (); ShowC ollection ( di ); // 2 3 8 9 10 di . push_front (12); ShowC ollection ( di ); // 12 2 3 8 9 10 4 4 5 10 5 4 5 } Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 11 / 84 Adaptatory kontenerów Kontenery sekwencyjne Kontenery vector, list, deque częściowo mogą być używane zamiennie ale zawsze pewnym kosztem Nie można żadnej z nich zbudować w oparciu o inną bez utraty wydajności Adaptatory Często przydają się także inne kontenery sekwencyjne Ponieważ można je oprzeć na jednej z tych 3 podstawowych, to nie są one implementowane osobno, a jako adaptacje jednego z kontenrów podstawowych Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 12 / 84 Adaptator queue Składnia2 template < class T , class Collection = deque <T > > class queue { ... }; Opis Implementuje kolejkę FIFO Nie udostępnia operacji „nie kolejkowych” Kontener domyślnie oparty o deque ale można użyć dowolnego kontenera dostarczającego metod front, back, push back, pop front (czyli nie vector) 2 Dostępna w pliku nagłówkowym queue Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 13 / 84 Adaptator queue — konstruktor queue(const Collection& = Collection()) Działanie: Tworzy pustą kolejkę (jeśli brak parametru) lub kolejkę zainicjalizowaną zawartością przekazanego kontenera Parametr: Kontener inicjalizujący kolejkę Zwracana wartość: brak Złożoność: Stała jeśli nie ma parametru bądź liniowa jeśli jest parametr Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 14 / 84 Adaptator queue — operacje kolejkowe Implementacja bool size_type reference c onst_r e fe re nce reference c onst_r e fe re nce void void empty () const size () const front () front () const back () back () const push ( const value_type & x ) pop () Sebastian Deorowicz (PŚl) Kontenery, algorytmy { return c . empty ();} { return c . size ();} { return c . front ();} { return c . front ();} { return c . back ();} { return c . back ();} { c . push_back ( x );} { c . pop_front ();} 2008–10–23 15 / 84 Adaptator queue — inne operacje Inne operacje Dostępne operatory porównywania kontenerów działające identycznie jak dla kontenera, na którym jest oparta kolejka Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 16 / 84 Adaptator queue — przykład Przykład # include < iostream > # include < list > # include < queue > using namespace std ; const int MAX = 10; template < class Queue > void ShowQueue ( Queue q ) { for (; ! q . empty (); q . pop ()) std :: cout << q . front () << " " ; std :: cout << std :: endl ; } int main ( int argc , char * argv []) { int tab [ MAX ] = {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10}; deque < int > di ( tab , tab +10); queue < int > qdi ( di ); // Sh owCollection ( qdi ); // Błąd kompilacji : ShowQueue ( qdi ); // // Błąd kompilacji : vector nie ma metody pop ! // queue < int , vector < int > > qvi ( vector < int >( tab , // ShowQueue ( qvi ); list < int > li ( tab , tab +10); li . reverse (); queue < int , list < int > > qli ( li ); ShowQueue ( qli ); // brak metod begin () i end () 1 2 3 4 5 6 7 8 9 10 tab +10)); 10 9 8 7 6 5 4 3 2 1 } Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 17 / 84 Adaptator stack Składnia3 template < class T , class Collection = deque <T > > class stack { ... }; Opis Implementuje stos Nie udostępnia operacji „nie stosowych” Kontener domyślnie oparty o deque ale można użyć dowolnego kontenera dostarczającego metod back, push back, pop back (czyli np. vector, list, deque) 3 Dostępna w pliku nagłówkowym stack Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 18 / 84 Adaptator stack — konstruktor stack(const Collection& = Collection()) Działanie: Tworzy pusty stos (jeśli brak parametru) lub stos zainicjalizowany zawartością przekazanego kontenera Parametr: Kontener inicjalizujący stos Zwracana wartość: brak Złożoność: Stała jeśli nie ma parametru bądź liniowa jeśli jest parametr Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 19 / 84 Adaptator stack — operacje stosowe Implementacja bool size_type reference c onst_r e fe re nce void void empty () const size () const top () top () const push ( const value_type & x ) pop () Sebastian Deorowicz (PŚl) Kontenery, algorytmy { return c . empty ();} { return c . size ();} { return c . back ();} { return c . back ();} { c . push_back ( x );} { c . pop_back ();} 2008–10–23 20 / 84 Adaptator stack — inne operacje Inne operacje Dostępne operatory porównywania stosów działające identycznie jak dla kontenera, na którym jest oparta stos Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 21 / 84 Adaptator stack — przykład Przykład # include < iostream > # include < vector > # include < stack > using namespace std ; const int MAX = 10; template < class Stack > void ShowStack ( Stack q ) { for (; ! q . empty (); q . pop ()) std :: cout << q . top () << " " ; std :: cout << std :: endl ; } int main ( int argc , char * argv []) { int tab [ MAX ] = {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10}; vector < int > vi ( tab , tab +10); stack < int , vector < int > > svi ( vi ); ShowStack ( svi ); // 10 9 8 7 6 5 4 3 2 1 deque < int > di ( tab , tab +10); stack < int > sdi ( di ); ShowStack ( sdi ); sdi . push (10); ShowStack ( sdi ); // 10 9 8 7 6 5 4 3 2 1 // 10 10 9 8 7 6 5 4 3 2 1 } Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 22 / 84 Adaptator priority queue Składnia4 template < class T , class Collection = vector <T > , class Compare = less < typename Collection :: value_type > > class pri ority_queue { ... }; Opis Implementuje kolejkę priorytetową, czyli taką kolejkę, w której elementy są umieszczane według priorytetu Nie udostępnia operacji „nie kolejkowych” ani operatorów porównania kontenerów Kontener domyślnie oparty o vector ale można użyć dowolnego kontenera dostarczającego metod front, push back, pop back oraz iteratorów dostępu swobodnego (czyli np. vector, deque, ale nie list) Ostatni parametr wzorca określa kryterium porównywania dla ustalenia priorytetu — domyślnie przy użyciu operatora < Wewnętrznie implementowana za pomocą kopca 4 Dostępna w pliku nagłówkowym queue Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 23 / 84 Adaptator priority queue — konstruktory priority_queue(const Compare& comp = Compare(), const Collection& = Collection()) Działanie: Tworzy pustą kolejkę priorytetową i inicjalizuje ją (jeśli jest parametr) zawartością kontenera przekazanego jako drugi parametr Parametry: pierwszy — określa kryterium sortowania drugi — zawiera dane do inicjalizacji kontenera Zwracana wartość: brak Złożoność: Stała jeśli nie ma parametru bądź O(n) jeśli jest parametr Uwaga: Po inicjalizacji kolejki wywoływana jest funkcja STL: make_heap(c.begin(), c.end(), comp) Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 24 / 84 Adaptator priority queue — konstruktory priority_queue(InputIterator first, InputIterator last, const Compare& comp = Compare(), const Collection& y = Collection()) Działanie: Tworzy pustą kolejkę priorytetową i inicjalizuje ją zawartością określoną przekazanymi iteratorami: [first, last) Parametry: first, last — iteratory specyfikujące zakres kontenera używanego do inicjalizacji kolejki priorytetowej trzeci — określa kryterium sortowania czwarty — zawiera dane do inicjalizacji kolekcji Zwracana wartość: brak Złożoność: O(n) Uwaga: Po inicjalizacji kolejki wywoływana jest funkcja STL: make_heap(c.begin(), c.end(), comp) Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 25 / 84 Adaptator priority queue — operacje kolejkowe Implementacja bool size_type c onst_r e fe re nce void void empty () const size () const top () const push ( const value_type & x ); pop (); { return c . empty ();} { return c . size ();} { return c . front ();} Złożoność empty, size, top — w zależności od złożoności tych operacji dla kontenera, na którym jest oparta kolejka priorytetowa; dla wektora będzie to O(1) push, pop — O(log n) Uwaga Zachowanie metod top i pop dla pustej kolejki jest niezdefiniowane Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 26 / 84 Adaptator priority queue — przykład Przykład # include < iostream > # include < queue > # include < vector > # include < deque > # include < functional > # include < string > using namespace std ; const int MAX = 10; template < class PQ > void ShowPQ ( PQ & pq ) { for (; ! pq . empty (); pq . pop ()) cout << pq . top () << " " ; cout << endl ; } int main ( int argc , char * argv []) { int tab [ MAX ] = {5 , 6 , 8 , 1 , 2 , 3 , 4 , 10 , 7 , 9}; vector < int > vi ( tab , tab +10); priority_queue < int , vector < int > , less < int > > pqvi1 ( less < int >() , vi ); ShowPQ ( pqvi1 ); // 10 9 8 7 6 5 4 3 2 1 priority_queue < int , vector < int > > pqvi2 ( tab , tab +10); ShowPQ ( pqvi2 ); // 10 9 8 7 6 5 4 3 2 1 priority_queue < int , deque < int > , greater < int > > pqdi1 ( greater < int >() , deque < int >( tab , tab +10)); ShowPQ ( pqdi1 ); // 1 2 3 4 5 6 7 8 9 10 priority_queue < string , vector < string > > pqs ; pqs . push ( " Ola " ); pqs . push ( " Jola " ); pqs . push ( " Iza " ); ShowPQ ( pqs ); // Ola Jola Iza } Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 27 / 84 Plan wykładu 1 Kontenery sekwencyjne Kontener deque Adaptatory kontenerów Adaptator kontenera queue Adaptator kontenera stack Adaptator kontenera priority queue 2 Kontenery asocjacyjne Klasa pair Kontener set Kontener multiset Kontener bitset Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 28 / 84 Klasa pair Opis5 Grupuje dwie wartości różnych typów w ramach jednej struktury Jest wykorzystywana w kontenerach i algorytmach STL Definicja template < class T1 , class T2 > struct pair { typedef T1 first_type ; typedef T2 second_type ; T1 first ; T2 second ; pair (); pair ( const T1 & x , const T2 & y ); template < class U , class V > pair ( const pair <U , V > & p ); }; 5 Klasa zdefiniowana w pliku utility Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 29 / 84 Klasa pair — konstruktory pair() Działanie: Inicjalizuje parę domyślnymi wartościami typów składowych pair(const T1& x, const T2& y) Działanie: Inicjalizuje parę wartościami x i y template <class U, class V> pair(const pair<U, V> &p) Działanie: Inicjalizuje parę wartością pary p Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 30 / 84 Klasa pair — operator porównania bool operator==(const pair<T1, T2>& x, const pair<T1, T2>& y) Działanie: Porównuje dwie pary za pomocą operatorów == wywoływanych dla pierwszych i drugich składowych Parametry: x, y — porównywane pary Zwracana wartość: x.first == y.first && x.second == y.second Złożoność: O(1) Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 31 / 84 Klasa pair — funkcja make pair template <class T1, class T2> pair<T1, T2> make_pair(T1 x, T2 y) Działanie: Tworzy obiekt pary Parametry: x, y — pierwszy i drugi element pary Zwracana wartość: obiekt pary zawierający x i y Złożoność: O(1) Uwaga: Funkcja umożliwia niepodawanie w sposób jawny typów, w odróżnieniu od wywołania konstruktora: std::pair<int,double>(10,5.6) std::make_pair(10,5.6) Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 32 / 84 Klasa pair — przykład Przykład # include < iostream > # include < utility > # include < string > using namespace std ; template < class Pair > void ShowPair ( Pair p ) { cout << " * " << p . first << " * } " << p . second << endl ; int main ( int argc , char * argv []) { pair < string , int > p1 ; ShowPair ( p1 ); // ** 0 pair < string , float > p2 ( " Test " , 10); ShowPair ( p2 ); // * Test * ShowPair ( make_pair (10 , 5.7)); // *10* ShowPair ( make_pair ( " Zuzia " , 5.7)); // * Zuzia * 10 5.7 5.7 } Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 33 / 84 Kontener set Opis6 Kontener umożliwia przechowywanie elementów W odróżnieniu od kontenerów sekwencyjnych, w kontenerze set porządek elementów nie jest określany przez pozycję, na której są one wstawiane Elementy są uporządkowywane automatycznie zgodnie z określonym kryterium sortowania Kontener umożliwia przechowywanie tylko jednej kopii elementu (powtórzenia są zabronione) Kontener jest dostosowany do wymagań algorytmów realizujących operacje zbiorowe (suma, przecięcie, itd.) 6 Dostępna w pliku nagłówkowym set Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 34 / 84 Kontener set Kryterium sortowania Uporządkowanie ścisłe słabe: Jeśli prawdziwe x < y , to y < x jest nieprawdziwe Jeśli x < y i y < z, to musi zachodzić x < z x < x jest zawsze fałszywe Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 35 / 84 Kontener set — konstruktory set(const Compare &comp = Compare(), const Allocator& = Allocator()) Działanie: Tworzy pusty zbiór Parametry: comp — kryterium sortowania (domyślnie less<T>) Allocator — obiekt alokatora Zwracana wartość: brak Złożoność: O(1) Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 36 / 84 Kontener set — konstruktory set(InputIterator first, InputIterator last, const Compare& comp = Compare(), const Allocator& = Allocator()) Działanie: Tworzy zbiór i inicjalizuje go elementami z zakresu [first, last) Parametry: first, last — iteratory wejściowe specyfikujące zakres comp — kryterium sortowania (domyślnie less<T>) Allocator — obiekt alokatora Zwracana wartość: brak Złożoność (n — liczba elementów w zakresie): O(n) jeśli elementy posortowane O(n log n) jeśli elementy nieposortowane Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 37 / 84 Kontener set — konstruktory set(const set<Key, Compare, Allocator>& x) Działanie: Tworzy zbiór i inicjalizuje go elementami ze zbioru x Parametr: x — zbiór użyty do zainicjalizowania tworzonego kontenera Zwracana wartość: brak Złożoność: liniowa względem liczby elementów x Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 38 / 84 Kontener set — przykład Przykład # include < set > # include < functional > using namespace std ; const int MAX = 10; typedef enum { poniedzialek , wtorek , sroda , czwartek , piatek , sobota , niedziela } t_days ; int main ( int argc , char * argv []) { int tab [ MAX ] = {1 , 52 , 31 , 25 , 4 , 8 , 65 , 45 , 65 , 10}; set < int > si , si2 ( tab , tab +10); ShowC ollection ( si ); // ShowC ollection ( si2 ); // 1 4 8 10 25 31 45 52 65 set < t_days > sd ; set < t_days , greater < t_days > > sd2 ; sd . insert ( wtorek ); ShowC ollection ( sd ); sd2 . insert ( sroda ); ShowC ollection ( sd2 ); sd . insert ( piatek ); // 1 sd2 . insert ( sobota ); // 5 4 2 set < t_days , greater < t_days > > sd3 ( sd2 ); ShowC ollection ( sd3 ); // 5 2 set < t_days , greater < t_days > > sd4 ( sd . begin () , sd . end ()); ShowC ollection ( sd4 ); // 4 1 } Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 39 / 84 Kontener set — przypisanie set<Key, Compare, Allocator >& operator = (const set<Key, Compare, Allocator>& x) Działanie: Operator przypisania, kopiujący zawartość kontenera Parametr: x — kopiowany zbiór Złożoność: liniowa względem sumy liczby elementów kopiowanego zbioru i liczby elementów zbioru bieżącego (elementy z bieżącego zbioru muszą być usunięte) Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 40 / 84 Kontener set — inne metody Metody zwracające iteratory Dostępne metody begin, end, rbegin, rend zwracające iteratory analogiczne do iteratorów dla kontenerów sekwencyjnych Złożoność: O(1) Uwaga: kolejność elementów określana przez kryterium sortowania Metody związane z rozmiarem Dostępne metody empty, size, max size analogiczne jak dla kontenerów sekwencyjnych Złożoność: O(1) Operatory Dostępne operatory ==, !=, <, <=, >=, > porównujące zbiory Złożoność: liniowa względem rozmiaru mniejszego ze zbiorów Uwaga: kolejność wstawiania elementów do porównywanych zbiorów nie ma znaczenia — liczy się tylko ich zawartość Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 41 / 84 Kontener set — wstawianie elementów pair<iterator, bool> insert(const value_type& x) Działanie: Wstawia element do zbioru Parametr: x — wstawiany element Zwracana wartość: Para opisująca wynik wstawiana; składowe oznaczają: first — iterator do wstawionego elementu lub do elementu już istniejącego jeśli próbujemy wstawiać element już istniejący second — wartość logiczna określająca czy element udało się wstawić (true) czy też taki element już istniał (false) Złożoność: O(log n), gdzie n jest liczbą elementów w kontenerze Przykład # include < iostream > # include < set > int main ( int argc , char * argv []) { std :: set < int > si ; std :: pair < std :: set < int >:: iterator , bool > status ; status = si . insert (5); std :: cout << status . second << std :: endl ; status = si . insert (5); std :: cout << status . second << std :: endl ; } Sebastian Deorowicz (PŚl) Kontenery, algorytmy // 1 // 0 2008–10–23 42 / 84 Kontener set — wstawianie elementów iterator insert(iterator position, const value_type& x) Działanie: Wstawia element do zbioru Parametry: position — wskazówka dla metody gdzie rozpocząć poszukiwanie miejsca dla wstawianego elementu; x — wstawiany element Zwracana wartość: Iterator do wstawionego (bądź istniejącego już wcześniej w zbiorze) elementu Złożoność: O(log n), gdzie n to liczba elementów w kontenerze Uwaga: Elementy są posortowane wewnątrz kontenera, więc podanie jako parametr miejsca bliskiego docelowemu pozwala na szybsze wstawianie — nawet w czasie O(1) Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 43 / 84 Kontener set — wstawianie elementów void insert(InputIterator first, InputIterator last) Działanie: Wstawia do zbioru elementy z zakresu [first, last) Parametry: first, last — iteratory specyfikujące zakres wstawianych elementów Zwracana wartość: brak Złożoność (n oznacza liczbę wstawianych elementów, s oznacza liczbę elementów w kontenerze): O(n + log s) jeśli elementy z zakresu są posortowane O(n log n + log s) jeśli elementy z zakresu nie są posortowane Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 44 / 84 Kontener set — usuwanie elementów void erase(iterator position) Działanie: Usuwa element wskazywany przez iterator Parametr: position — iterator wskazujący element do usunięcia Zwracana wartość: brak Złożoność: O(1) Uwaga: Jeśli position nie jest iteratorem wskazującym na istniejący element, to zachowanie niezdefiniowane Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 45 / 84 Kontener set — usuwanie elementów size_type erase(const key_type& x) Działanie: Usuwa element x ze zbioru Parametr: x — element do usunięcia Zwracana wartość: liczba usuniętych elementów (0 bądź 1) Złożoność: O(log n) gdzie n oznacza liczbę elementów w zbiorze Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 46 / 84 Kontener set — usuwanie elementów iterator erase(iterator first, iterator last) Działanie: Usuwa elementy z zakresu [first, last) Parametry: first, last — iteratory specyfikujące zakres Zwracana wartość: brak Złożoność: O(last − first) Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 47 / 84 Kontener set — usuwanie elementów i zamiana zbiorów void clear() Działanie: Usuwa wszystkie elementy ze zbioru Parametry: brak Zwracana wartość: brak Złożoność: O(n) void swap(set<Key, Compare, Allocator>&) Działanie: Zamienia zbiór ze zbiorem podanym jako parametr Parametr: zbiór do zamiany Zwracana wartość: brak Złożoność: O(1) Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 48 / 84 Kontener set — wyszukiwanie iterator find(const key_type& x) const_iterator find(const key_type& x) const Działanie: Wyszukuje element x w zbiorze Parametr: x — wyszukiwany element Zwracana wartość: Iterator (stały iterator) do pozycji zawierającej element x lub iterator do pozycji za ostatnim elementem (wynik działania end()) jeśli elementu nie ma w zbiorze Złożoność: O(log n), gdzie n to liczebność kontenera Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 49 / 84 Kontener set — zliczanie size_type count(const key_type& x) const Działanie: Zwraca liczbę elementów x w zbiorze Parametr: x — wyszukiwany element Zwracana wartość: Liczba wystąpień x w zbiorze (0 lub 1) Złożoność: O(log n), gdzie n to liczebność kontenera Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 50 / 84 Kontener set — przykład Przykład # include < iostream > # include < set > using namespace std ; const int MAX = 5; int main ( int argc , char * argv []) { int tab [ MAX ] = {1 , 2 , 3 , 4 , 5}; set < int > si ( tab , tab + MAX ) , si2 ( tab , tab + MAX ); ShowC ollection ( si ); // 1 2 3 4 // Źle ! set < int >:: iterator p = si . find (3); * p = 7; // To jest niestety legalne ShowC ollection ( si ); // 1 2 7 4 cout << * si . find (4) << " " << si . count (4) << endl ; // 0 2 !!! 5 5 } Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 51 / 84 Kontener set — modyfikacja wartości kluczy Skąd te problemy?7 Standard C++ wymaga aby obiekty przechowywane w kontenerze set nie miały modyfikatora const Taki element można w związku z tym zmodyfikować posługując się iteratorem! Jak poprawnie modyfikować klucze? 1 Wyszukać element do zmiany 2 Sporządzić jego lokalną kopię 3 Zmodyfikować kopię (w obiektach można modyfikować np. jedno z pól — klucz, po którym zbiór jest sortowany) 4 Usunąć element do zmiany 5 Wstawić nowy element 7 Więcej w S. Meyers, STL w praktyce. 50 sposobów efektywnego wykorzystania Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 52 / 84 Kontener set — przykład Przykład # include < iostream > # include < set > using namespace std ; const int MAX = 5; int main ( int argc , char * argv []) { int tab [ MAX ] = {1 , 2 , 3 , 4 , 5}; set < int > si ( tab , tab + MAX ) , si2 ( tab , tab + MAX ); ShowC ollection ( si ); // 1 2 3 4 // Źle ! set < int >:: iterator p = si . find (3); * p = 7; // To jest niestety legalne ShowC ollection ( si ); // 1 2 7 4 cout << * si . find (4) << " " << si . count (4) << endl ; // 0 2 !!! 5 5 // Dobrze p = si2 . find (3); int tmp = * p ; tmp = 7; // Dla obiektów modyfikujemy np . jedno z pól ( klucz ) si2 . erase ( p ); si2 . insert ( tmp ); ShowC ollection ( si2 ); // 1 2 7 4 5 cout << * si2 . find (4) << " " << si2 . count (4) << endl ; // 4 1 !!! } Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 53 / 84 Kontener set — wyszukiwanie iterator lower_bound(const key_type& x) const_iterator lower_bound(const key_type& x) const Działanie: Wyszukuje najmniejszy element nie mniejszy niż x Parametr: x — wyszukiwana wartość Zwracana wartość: Iterator do najmniejszego elementu nie mniejszego niż x bądź wartość zwracana przez end() Złożoność: O(log n), gdzie n to liczebność kontenera Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 54 / 84 Kontener set — wyszukiwanie iterator upper_bound(const key_type& x) const_iterator upper_bound(const key_type& x) const Działanie: Wyszukuje największy element nie większy niż x Parametr: x — wyszukiwana wartość Zwracana wartość: Iterator do najmniejszego elementu większego niż x bądź wartość zwracana przez end() Złożoność: O(log n), gdzie n to liczebność kontenera Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 55 / 84 Kontener set — wyszukiwanie pair<iterator, iterator> equal_range(const key_type& x) pair<const_iterator, const_iterator> equal_range(const key_type& x) const Działanie: Wyszukuje zakres elementów zawierających x Parametr: x — wyszukiwana wartość Zwracana wartość: Wyniki działania lower_bound i upper_bound w postaci pary Złożoność: O(log n), gdzie n to liczebność kontenera Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 56 / 84 Kontenera set — wyszukiwanie Przykład # include < iostream > # include < set > using namespace std ; const int MAX = 5; int main ( int argc , char * argv []) { int tab [ MAX ] = {1 , 19 , 32 , 15 , 25}; set < int > si ( tab , tab + MAX ); pair < set < int >:: iterator , set < int >:: iterator > range ; ShowC ollection ( si ); cout cout cout cout << << << << * si . lower_bound (15) * si . lower_bound (16) * si . upper_bound (15) * si . upper_bound (25) << << << << endl ; endl ; endl ; endl ; // 1 // // // // range = si . equal_range (15); cout << * range . first << " " << * range . second << endl ; 15 19 25 32 15 19 19 32 // 15 19 } Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 57 / 84 Kontener set Jak to wszystko jest w środku zbudowane? Złożoności operacji mocno sugerują, że dane przechowywane są w zrównoważonych drzewach poszukiwań binarnych Często są to drzewa czerwono-czarne Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 58 / 84 Kontener multiset Opis8 Kontener jest tym samym co kontener set z takim wyjątkiem, że elementy mogą się powtarzać Interfejs jest w zasadzie identyczny jak dla zbioru, z wyjątkiem jednej metody wstawiania elementów Nieco większego sensu nabierają takie metody jak count zwracające liczbę wystąpień elementu w wielozbiorze Złożoności niektórych operacji rosną usuwanie klucza — O(log n + count) zliczanie wystąpień klucza — O(log n + count) 8 Dostępna w pliku nagłówkowym set Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 59 / 84 Kontener multiset — wstawianie elementu iterator insert(const value_type& x) Działanie: Wstawia element x do wielozbioru Parametr: x — element do wstawienia Zwracana wartość: Iterator do wstawionego elementu (dla zbioru była tu para: iterator, wartość logiczna) Złożoność: O(log n), gdzie n to liczebność kontenera Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 60 / 84 Kontener bitset9 Opis Tablica zawierająca ustaloną liczbę wartości logicznych Wygodna np. do zarządzania zbiorem znaczników Rozmiar kontenera przekazywany jest jako parametr wzorca a nie jako parametr konstruktora! 8 Dostępna w pliku nagłówkowym bitset Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 61 / 84 Kontener bitset — konstruktory bitset() Działanie: Tworzy obiekt klasy bitset<N> zainicjalizowany wartościami 0 dla wszystkich bitów Parametry: brak Zwracana wartość: brak Złożoność: O(N) bitset(unsigned long val) Działanie: Tworzy obiekt klasy bitset<N> zainicjalizowany M najmłodszymi bitami val, gdzie M = min(N, sizeof(unsigned long)) Parametr: val — wartość używana do inicjalizacji Zwracana wartość: brak Złożoność: O(1) Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 62 / 84 Kontener bitset — konstruktory bitset(const basic_string<charT, traits, Allocator>& str, typename basic_string<charT, traits, Allocator>::size_type pos=0, typename basic_string<charT, traits, Allocator>::size_type n = basic_string<charT, traits, Allocator>::npos) Działanie: Tworzy obiekt klasy bitset<N> zainicjalizowany wartościami przekazanymi jako obiekt klasy string (jakkolwiek „magicznie” to wygląda) Parametry: str — obiekt klasy string używany do inicjalizacji pos — początkowa pozycja, od której pobierane są bity do inicjalizacji n — maksymalna liczba bitów, które mają być użyte do inicjalizacji Zwracana wartość: brak Złożoność: O(M), gdzie M = min(N, str.size() - pos) Zgłaszane wyjątki: invalid_argument — któryś ze znaków inicjalizujących miał wartość różną od 0 i 1 out_of_range — pos > str.size() Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 63 / 84 Kontener bitset — operatory bitset<N>& operator&=(const bitset<N>& rhs) Działanie: Iloczyn bitowy dwóch kontenerów bitset (zmieniana jest zawartość bieżącego kontenera) Parametr: rhs — kontener, z którym wykonywany jest iloczyn bitowy kontenera bieżącego Zwracana wartość: referencja do bieżącego obiektu Złożoność: O(N) Podobne operatory bitset<N>& operator|=(const bitset<N>& rhs) — suma logiczna bitset<N>& operator^=(const bitset<N>& rhs) — różnica symetryczna Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 64 / 84 Kontener bitset — operatory bitset<N>& operator<<=(size_t pos) Działanie: Przesuwa w lewo bity bieżącego kontenera o pos pozycji Parametr: pos — liczba bitów do przesunięcia Zwracana wartość: referencja do bieżącego obiektu Złożoność: O(N) Uwaga: pos bitów z prawej strony otrzymuje wartość 0 Podobny operator bitset<N>& operator>>=(size_t pos) Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 65 / 84 Kontener bitset — operatory bitset<N>& set() Działanie: Ustawia wartość wszystkich bitów na 1 Parametry: brak Zwracana wartość: referencja do bieżącego obiektu Złożoność: O(N) bitset<N>& set(size_t pos, bool val=true) Działanie: Ustawia wartość bitu na pozycji pos na val Parametry: pos — pozycja bitu val — nowa wartość bitu Zwracana wartość: referencja do bieżącego obiektu Złożoność: O(1) Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 66 / 84 Kontener bitset — przykład Przykład # include < iostream > # include < bitset > # include < string > using namespace std ; int main ( int argc , char * argv []) { bitset <10 > bs10 ; cout << bs10 << endl ; // 0000000000 bitset <14 > bs14 (0 xFFA9 ); cout << bs14 << endl ; // 11111110101001 bitset <20 > bs20 ( string ( " 101001011001 " )); cout << bs20 << endl ; // 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 1 // bs10 &= bs14 ; bs10 ^= bs10 ; cout << bs10 << endl ; // 0000000000 // Błąd kompilacji ! bs14 < <= 2; cout << bs14 << endl ; // 11111010100100 bs20 . set (); cout << bs20 << endl ; // 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 bs10 . set (3); cout << bs10 << endl ; // 0000001000 } Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 67 / 84 Kontener bitset — metody bitset<N>& reset() Działanie: Ustawia wartość wszystkich bitów na 0 Parametry: brak Zwracana wartość: referencja do bieżącego obiektu Złożoność: O(N) bitset<N>& reset(size_t pos) Działanie: Ustawia wartość bitu na pozycji pos na 0 Parametr: pos — pozycja bitu Zwracana wartość: referencja do bieżącego obiektu Złożoność: O(1) Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 68 / 84 Kontener bitset — operatory bitset<N> operator~() const Działanie: Zwraca obiekt będący kopią bieżącego obiektu, w którym wszystkie bity są zanegowane Parametry: brak Zwracana wartość: Kopia bieżącego obiektu, w którym wszystkie bity są zanegowane Złożoność: O(N) Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 69 / 84 Kontener bitset — negowanie bitów bitset<N>& flip() Działanie: Neguje wartości wszystkich bitów w kontenerze Parametry: brak Zwracana wartość: referencja do bieżącego obiektu Złożoność: O(N) bitset<N>& flip(size_t pos) Działanie: Neguje wartość bitu na pozycji pos Parametr: pos — pozycja bitu do zanegowania Zwracana wartość: referencja do bieżącego obiektu Złożoność: O(1) Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 70 / 84 Kontener bitset — konwersja unsigned long to_ulong() const Działanie: Konwertuje zawartość kontenera na typ unsigned long Parametry: brak Zwracana wartość: Wartość typu unsigned long zawierająca na kolejnych pozycjach wartości bitów z kontenera bitset Złożoność: O(1) Uwaga: Jeśli rozmiar kontenera jest większy niż sizeof(unsigned long) to generowany jest wyjątek overflow_error Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 71 / 84 Kontener bitset — konwersja basic_string<charT, traits, Allocator> to_string() const basic_string <charT, traits, allocator<charT> >to_string() const basic_string <charT, char_traits<charT>, allocator <charT> > to_string() const basic_string <char, char_traits<char>, allocator <char> > to_string() const Działanie: Tworzy obiekt klasy string zawierający na kolejnych znakach wartości 0 bądź 1 odpowiadające wartościom bitów Parametry: brak Zwracana wartość: Obiekt klasy string reprezentujący wartości bitów z kontenera Złożoność: O(N) Uwaga: Pierwszy bit obiektu klasy string odpowiada najstarszemu bitowi kontenera Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 72 / 84 Kontener bitset — inne metody size_t count() const Działanie: Zwraca liczbę ustawionych bitów w kontenerze Parametry: brak Zwracana wartość: Liczba ustawionych bitów Złożoność: O(N) size_t size() const Działanie: Zwraca rozmiar kontenera Parametry: brak Zwracana wartość: N Złożoność: O(1) Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 73 / 84 Kontener bitset — operatory porównań bool operator==(const bitset<N>& rhs) const Działanie: Porównuje dwa obiekty klasy bitset<N> Parametr: rhs — kontener do porównania Zwracana wartość: true jeśli obiekty są identyczne Złożoność: O(N) bool operator!=(const bitset<N>& rhs) const Działanie: Porównuje dwa obiekty klasy bitset<N> Parametr: rhs — kontener do porównania Zwracana wartość: true jeśli obiekty nie są identyczne Złożoność: O(N) Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 74 / 84 Kontener bitset — testowanie bitów bool test(size_t pos) const Działanie: Sprawdza wartość bitu pos Parametr: pos — numer bitu do sprawdzenia Zwracana wartość: true jeśli bit jest ustawiony Złożoność: O(1) Uwaga: Jeśli pos nie jest prawidłowym numerem pozycji to generuje wyjątek out_of_range Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 75 / 84 Kontener bitset — testowanie bitów bool any() const Działanie: Sprawdza czy jakikolwiek bit jest ustawiony Parametry: brak Zwracana wartość: true jeśli jakikolwiek bit kontenera jest ustawiony Złożoność: O(N), choć może być nawet O(1) dla niektórych implementacji bool none() const Działanie: Sprawdza czy żaden bit nie jest ustawiony Parametry: brak Zwracana wartość: true jeśli żaden bit kontenera nie jest ustawiony Złożoność: O(N), choć może być nawet O(1) dla niektórych implementacji Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 76 / 84 Kkontener bitset — operatory przesunięć bitowych bitset<N> operator<<(size_t pos) const Działanie: Zwraca obiekt będący kopią obiektu bieżącego przesuniętą o pos bitów w lewo Parametr: pos — przesunięcie Zwracana wartość: Kopia obiektu bieżącego przesunięta w lewo o pos bitów Złożoność: O(N) bitset<N> operator>>(size_t pos) const Działanie: Zwraca obiekt będący kopią obiektu bieżącego przesuniętą o pos bitów w prawo Parametr: pos — przesunięcie Zwracana wartość: Kopia obiektu bieżącego przesunięta w prawo o pos bitów Złożoność: O(N) Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 77 / 84 Kontener bitset — operatory indeksowania bool operator[](size_t pos) const Działanie: Zwraca wartość bitu na pozycji pos Parametr: pos — pozycja bitu Zwracana wartość: true jeśli bit jest ustawiony Złożoność: O(1) Uwaga: Jeśli pos jest niepoprawne to zachowanie niezdefiniowane bitset<N>::reference operator[](size_t pos) Działanie: Zwraca obiekt typu bitset<N>::reference taki, że: (*this)[pos] == this->test(pos) (*this)[pos ] = val jest równoważne this->set(pos, val) Parametr: pos — pozycja bitu Zwracana wartość: Obiekt typu bitset<N>::reference Złożoność: O(1) Uwaga: Jeśli pos jest niepoprawne to zachowanie niezdefiniowane Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 78 / 84 Kontener bitset — dostęp do bitów przez operator[] Metody reference& operator=(bool x) — umożliwia przypisania b[i] = x reference& operator=(const reference&) — umożliwia przypisania b[i] = b[j] bool operator~() const — umożliwia zanegowanie bitu: a = ~b[i] operator bool() const — umożliwia automatyczną konwersję do typu bool: x = b[i] reference& flip() — umożliwia negowanie bitu: b[i].flip() Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 79 / 84 Kontener bitset — operatory bitowe bitset<N> operator&(const bitset<N>& lhs, const bitset<N>& rhs) Działanie: Zwraca obiekt klasy bitset<N> będący iloczynem bitowym lhs i rhs Parametry: lhs, rhs — obiekty, na których wykonywany jest iloczyn bitowy Zwracana wartość: Obiekt klasy bitset<N> zawierający iloczyn bitowy Złożoność: O(N) Podobne operatory bitset<N> operator|(const bitset<N>& lhs, const bitset <N>& rhs) — zwraca sumę logiczną bitset<N> operator^(const bitset<N>& lhs, const bitset <N>& rhs) — zwraca różnicę symetryczną Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 80 / 84 Kontener bitset — operatory strumieniowe template <class charT, class traits, size_t N> basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>& is, bitset<N>& x) Działanie: Wczytuje ze strumienia wejściowego nie więcej niż N bitów do kontenera Parametry: is — strumień wejściowy x — obiekt klasy bitset<N> Zwracana wartość: referencja do obiektu strumienia wejściowego Złożoność: O(N) Uwaga: Wczytywanie bitów kończy się jeśli zajdzie dowolny z warunków: wczytano N bitów napotkano znak EOF w strumieniu następny znak w strumieniu jest różny od 0 i 1 Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 81 / 84 Kontener bitset — operatory strumieniowe template <class charT, class traits, size_t N> basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>& os, const bitset<N>& x) Działanie: Wypisuje bity z kontenera w postaci łańcucha znakowego do strumienia wyjściowego Parametry: os — strumień wyjściowy x — kontener bitset<N> Zwracana wartość: referencja do obiektu strumienia wyjściowego Złożoność: O(N) Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 82 / 84 Kontener bitset — przykład Przykład # include < iostream > # include < bitset > # include < string > using namespace std ; int main ( int argc , char * argv []) { bitset <16 > bs (0 xF1F1 ); cout << bs << endl ; cout << ~ bs << endl ; // 1111000111110001 // 0000 111000001110 bs [4]. flip (); bs [5] = 0; cout << bs << endl ; bs [4] = bs [0]; cout << bs << endl ; cout << bs . count () << endl ; // 1111000111000001 // 1111000111010001 // 9 cout << ( bs ^ bitset <16 >( string ( " 10010010 " ))) << endl ; // 1111 000101000011 } Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 83 / 84 Co będzie za tydzień? Poznamy kolejne kontenery asocjacyjne (map, multimap) Dowiemy się jeszcze więcej o iteratorach Poznamy też kolejne algorytmy Sebastian Deorowicz (PŚl) Kontenery, algorytmy 2008–10–23 84 / 84