Różnice między wybraną wersją a wersją aktualną.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
lower_bound_upper_bound [2009/04/28 14:30] jg |
lower_bound_upper_bound [2009/04/28 15:08] (aktualna) jg |
||
|---|---|---|---|
| Linia 32: | Linia 32: | ||
| ''//ForwardIterator first//'' - element kolekcji, od którego rozpocznie się wyszukiwanie | ''//ForwardIterator first//'' - element kolekcji, od którego rozpocznie się wyszukiwanie | ||
| + | |||
| + | ''//ForwardIterator last//'' - element kolekcji, który jako pierwszy nie będzie branu pod uwagę przez algorytm | ||
| + | |||
| + | ''//const LessThanComparable& value//'' - element wyszukiwany (do wstawienia) | ||
| + | |||
| + | ''//StrictWeakOrdering comp//'' - obiekt funkcyjny porównujacy dwa elementy (w przypadku użycia wersji z predykatem) | ||
| ===== Wartość zwracana ===== | ===== Wartość zwracana ===== | ||
| - | W wyniku działania obu funkcji zwracany jest iterator wskazujący na element zadanego zbioru. W wypadku "lower_bound" wskazywana jest pierwsza pozycja, na ktorą należy wstawić zadany element, aby nie zaburzyć posortowanego ciągu. "upper_bound" zwraca ostatnią taką pozycję. | + | W wyniku działania obu funkcji zwracany jest iterator wskazujący na element badanego zbioru. W wypadku "lower_bound" wskazywana jest pierwsza pozycja, na ktorą należy wstawić zadany element, aby nie zaburzyć posortowanego ciągu. "upper_bound" zwraca ostatnią taką pozycję. |
| + | |||
| + | ===== Użycie ===== | ||
| + | |||
| + | <code cpp>lower_bound(first, last, value [, comp])</code> | ||
| + | //analogicznie dla// **upper_bound** | ||
| + | |||
| + | Algorytm przeszukuje dane w zakresie **[first;last)**. Dla poprawnego działania należy podać iteratory na pierwszy element ciągu przeszukiwanego oraz na pierwszy element za ostatnim do przeszukiwania. Jako **//value//** należy podać obiekt klasy elementów zamieszczonych w przeszukiwanym ciągu. | ||
| + | Prosty przykład użycia: | ||
| + | <code cpp>#include <vector> | ||
| + | #include <algorithm> | ||
| + | |||
| + | int main() | ||
| + | { | ||
| + | std::vector<int> liczby; | ||
| + | for(int i=0;i<10;++i) | ||
| + | liczby.push_back(i); | ||
| + | std::vector<int>::iterator iter; | ||
| + | iter = lower_bound(liczby.begin(),liczby.end(),3); | ||
| + | return 0; | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | Wersja z predykatem wymaga podania jako czwartego argumentu obiektu funkcyjnego służącego do porównywania danych obiektów. Przykład użycia: | ||
| + | <code cpp>#include <vector> | ||
| + | #include <algorithm> | ||
| + | |||
| + | |||
| + | class rowne | ||
| + | { | ||
| + | public: | ||
| + | bool operator()(const int &a, const int &b) | ||
| + | { | ||
| + | return ( a < b) ? true : false; | ||
| + | }; | ||
| + | }; | ||
| + | |||
| + | int main() | ||
| + | { | ||
| + | std::vector<int> liczby; | ||
| + | for(int i=0;i<10;++i) | ||
| + | liczby.push_back(i); | ||
| + | std::vector<int>::iterator iter; | ||
| + | iter = lower_bound(liczby.begin(),liczby.end(),3,rowne()); | ||
| + | return 0; | ||
| + | }</code> | ||
| + | |||
| + | ===== Ostrzeżenie ===== | ||
| + | Δ Algorytmy wymagają posortowanych zbiorów. Działanie na danych nieposortowanych może być źródłem błędów. | ||
| + | |||
| + | Δ Wersja bez predykatu wymaga do działania operator //**<**// dla klasy umieszczonej w zbiorze. | ||
| + | |||
| + | Δ Wersja z predykatem wymaga danych posortowanych przy użyciu tego predykatu. | ||
| + | ===== Przykładowy program wykorzystujący algorytmy upper_bound oraz lower_bound ===== | ||
| + | {{upper_lower_bound.cpp}} | ||