======push_heap i pop_heap - opis algorytmów====== Algorytmy push_heap i pop_heap służą do operacji na kolekcjach danych, w których elementy ustawione są w strukturze kopca (stogu). Algorytm push_heap dodaje nowy element do kolekcji, a algorytm pop_heap zdejmuje element ze szczytu kopca. Struktura kopca po zastosowaniu tych algorytmów pozostaje niezachwiana. ===== Nagłówek ===== #include Aby korzystać z algorytmów push_heap i pop_heap musimy dodać plik nagłówkowy . ===== Struktura kopca ===== Użycie algorytmów push_heap i pop_heap ma sens jedynie wtedy, gdy kolekcja danych przechowuje elementy w strukturze kopca. Aby uzyskać strukturę kopca wykorzystujemy algorytm make_heap. Przykłady użycia i jego opis można znaleźć w tym pliku: {{:make_heap1.cpp|}} {{:kopiec.gif|}} Na rysunku została przedstawiona kolekcja danych z elementami uporządkowanymi w kopiec. Kolorem czerwonym oznaczono indeksy tablicy. Kopiec sprawia, że na pierwszej pozycji znajduje się największy element (element tablicy o indeksie 0). Każde następne elementy są indeksowane według reguły: * jeśli rodzic ma indeks n to jego dzieci maja indeksy 2n+1 i 2n+2 ===== push_heap - konstrukcja ===== template void push_heap ( RandomAccessIterator first, RandomAccessIterator last ); template void push_heap ( RandomAccessIterator first, RandomAccessIterator last, Compare comp ); ===== push_heap - argumenty ===== Iteratory last i first są iteratorami kolekcji danych i wskazują pewien zakres. Pierwsze elementy w tym zakresie powinny być w postaci kopca, a ostatni element zakresu (pozycja last-1) powinien być elementem, który chcemy dodać do kopca. Po wykonaniu algorytmu, element zostanie dodany na właściwą pozycje tak, aby struktura kopca została zachowana. Trzeci, opcjonalny argument, to funkcja, według której określony jest porządek kopca (relacja rozstrzygająca, który element jest "większy"). Funkcja musi być postaci: bool comp(type a, type b) gdzie //type// jest typem obiektów przechowywanych w kolekcji. Jeżeli trzeci argument nie zostanie podany, do porównania używany jest operator < . ===== push_heap - zastosowanie ===== Poniższa ilustracja przedstawia, co się dzieje podczas użycia funkcji push_heap: {{:kopiec_push.gif|}} A to fragment kodu ilustrujący tę sytuację: #include #include #include using namespace std; int main(){ int liczby[]={1,5,23,17,8}; vector wektor(liczby, liczby+5); make_heap(wektor.begin(),wektor.end()); for(int i=0;i ===== pop_heap - konstrukcja ===== template void pop_heap ( RandomAccessIterator first, RandomAccessIterator last ); template void pop_heap ( RandomAccessIterator first, RandomAccessIterator last, Compare comp ); ===== pop_heap - argumenty ===== Algorytm pop_heap zdejmuje element ze szczytu kopca. Pierwszy argument, to iterator wskazujący na początek kolekcji danych w postaci kopca, włącznie z elementem do usunięcia. Drugi argument, to iterator wskazujacy na koniec kolekcji. Po użyciu algorytmu, element usuwany jest umieszczany na pozycji last-1. Trzeci, opcjonalny argument, to funkcja, według której określony jest porządek kopca (relacja rozstrzygająca, który element jest "większy"). Funkcja musi być postaci: bool comp(type a, type b) gdzie //type// jest typem obiektów przechowywanych w kolekcji. Jeżeli trzeci argument nie zostanie podany, do porównania uzywany jest operator < . ===== pop_heap - zastosowanie ===== Poniższa ilustracja pokazuje działanie algorytmu pop_heap: {{:kopiec_pop.gif|}} A to fragment kodu ilustrujący tę sytuację: #include #include #include using namespace std; int main(){ int liczby[]={1,5,23,17,8,99}; vector wektor(liczby, liczby+6); make_heap(wektor.begin(),wektor.end()); for(int i=0;i ===== Więcej przykładów... ===== Więcej przykładów, w tym także na wywołanie algorytmów pop_heap i push_heap z funkcją porównującą w argumencie, można znaleźć w tym pliku: {{:stl_algorytmy:stl_algorytmy:heap_pop_push.cpp|}}