Алгоритми визначення мінімуму і максимуму. Приклад
Зміст
- 1. Алгоритм min. Пошук мінімуму між двома значеннями
- 2. Алгоритм min_element. Пошук мінімального елементу в наборі значень
- 3. Алгоритм max. Пошук максимуму між двома значеннями
- 4. Алгоритм max_element. Пошук максимуму в послідовності
- 5. Алгоритм lexicographical_compare. Порівняти поелементно 2 послідовності
- Споріднені теми
Пошук на інших ресурсах:
1. Алгоритм min. Пошук мінімуму між двома значеннями
Алгоритм min порівнює два об’єкти і повертає менший з них. Критерій порівняння елементів може бути заданий предикатом.
Алгоритм має декілька перевантажених реалізацій
template <class Type> constexpr const Type& min( const Type& left, const Type& right); template <class Type, class Pr> constexpr const Type& min( const Type& left, const Type& right, BinaryPredicate pred); template <class Type> constexpr Type min( initializer_list<Type> ilist); template <class Type, class Pr> constexpr Type min( initializer_list<Type> ilist, BinaryPredicate pred);
де
- left, right – об’єкти, що порівнюються;
- pred – предикат, що використовується для порівняння двох об’єктів. Це може бути також лямбда-вираз;
- inlist – об’єкт, що містить елементи для порівняння.
Приклад.
#include <iostream> #include <list> #include <algorithm> #include <vector> #include <functional> using namespace std; // Функція порівняння. // Якщо знак < замінити на >, то буде пошук максимуму. bool MoreThan(int a, int b) { return a < b; } void main() { // Алгоритм min - пошук мінімуму між двома значеннями // 1. Пошук між значеннями типу double double minDouble = min(2.8, 3.6); cout << "minDouble = " << minDouble << endl; // 2. Пошук між цілими числами, // використовується функція порівняння int minInt = min(29, 36, MoreThan); cout << "minInt = " << minInt << endl; }
Результат
minDouble = 2.8 minInt = 29
⇑
2. Алгоритм min_element. Пошук мінімального елементу в наборі значень
Алгоритм виконує пошук найменшого елементу в заданому діапазоні. Критерій впорядкування може бути заданий бінарним предикатом.
Найбільш вживані перевантажені реалізації алгоритму наступні
template <class ForwardIterator> constexpr ForwardIterator min_element( ForwardIterator first, ForwardIterator last ); template <class ForwardIterator, class Compare> constexpr ForwardIterator min_element( ForwardIterator first, ForwardIterator last, Compare pred);
де
- first, last – прямі ітератори, які вказують відповідно на перший та останній елемент діапазону;
- pred – бінарний предикат, який задає умову, коли один елемент менше за інший. Якщо перший елемент менший за другий, то предикат повинен повертати true.
Приклад.
#include <iostream> #include <list> #include <algorithm> #include <vector> #include <functional> using namespace std; // Функція порівняння. // Якщо знак < замінити на >, то буде пошук максимуму. bool MoreThan(int a, int b) { return a < b; } void main() { // Алгоритм min_element - пошук мінімуму у наборі значень // 1. Пошук у векторі чисел типу double vector<double> V = { 2.8, 1.6, 2.9, 3.3, 4.5, -1.8, -2.2 }; vector<double>::iterator itV = min_element(V.begin(), V.end()); cout << "min_element(V) = " << *itV << endl; // 2. Пошук між цілими числами, // використовується функція порівняння list<int> L = { 2, 3, 8, -4, 1, 3, -2 }; list<int>::iterator itL = min_element(L.begin(), L.end(), MoreThan); cout << "min_element(L) = " << *itL << endl; // 3. Пошук між цілими числами, // використовується лямбда-вираз itL = min_element(L.begin(), L.end(), [](int a, int b) { return a < b; }); cout << "min_element(L) = " << *itL << endl; }
Результат
min_element(V) = -2.2 min_element(L) = -4 min_element(L) = -4
⇑
3. Алгоритм max. Пошук максимуму між двома значеннями
Алгоритм max порівнює два об’єкти та повертає більший з них. В алгоритмі дозволяється задавати критерій упорядкування з допомогою бінарного предикату.
Перевантажені реалізації алгоритму наступні
template <class Type> constexpr Type& max( const Type& left, const Type& right); template <class Type, class Pr> constexpr Type& max( const Type& left, const Type& right, BinaryPredicate pred); template <class Type> constexpr Type& max ( initializer_list<Type> ilist); template<class Type, class Pr> constexpr Type& max( initializer_list<Type> ilist, BinaryPredicate pred);
де
- left, right – відповідно перший та другий з порівнюваних об’єктів;
- pred – бінарний предикат, що задає спосіб порівняння об’єктів;
- ilist – список з об’єктами, які потрібно порівняти.
Приклад.
#include <iostream> #include <list> #include <algorithm> #include <vector> #include <functional> using namespace std; // Функція порівняння. // Якщо знак < замінити на >, то буде пошук мінімуму. bool LessThan(int a, int b) { return a < b; } void main() { // Алгоритм max - пошук максимуму між двома значеннями // 1. Пошук між значеннями типу double double maxDouble = max(2.8, 3.6); cout << "maxDouble = " << maxDouble << endl; // 2. Пошук між цілими числами, // використовується функція порівняння int maxInt = max(29, 36, LessThan); cout << "maxInt = " << maxInt << endl; }
Результат
maxDouble = 3.6 maxInt = 36
⇑
4. Алгоритм max_element. Пошук максимуму в послідовності
Алгоритм max_element повертає перше входження найбільшого елементу в послідовності, що задається діапазоном. В алгоритмі можна вказати бінарний предикат, що буде задавати умову пошуку максимального значення.
Алгоритм має декілька перевантажених реалізацій, найбільш поширені з яких наступні
template <class ForwardIterator> constexpr ForwardIterator max_element( ForwardIterator first, ForwardIterator last ); template <class ForwardIterator, class Compare> constexpr ForwardIterator max_element( ForwardIterator first, ForwardIterator last, Compare pred );
тут
- first, last – прямі ітератори, які вказують відповідно на перший та останній елемент діапазону, що розглядається;
- pred – бінарний предикат, який задає умову, коли один елемент менше за іншого. Якщо перший елемент менший за другий, то предикат повинен повертати true.
Приклад.
#include <iostream> #include <list> #include <algorithm> #include <vector> #include <functional> using namespace std; // Функція порівняння. // Якщо знак < замінити на >, то буде пошук мінімуму. bool MoreThan(int a, int b) { return a < b; } void main() { // Алгоритм max_element - пошук максимуму у наборі значень. // 1. Пошук у векторі чисел типу double vector<double> V = { 2.8, 1.6, 2.9, 3.3, 4.5, -1.8, -2.2 }; vector<double>::iterator itV = max_element(V.begin(), V.end()); cout << "max_element(V) = " << *itV << endl; // 2. Пошук між цілими числами, // використовується функція порівняння list<int> L = { 2, 3, 8, -4, 1, 3, -2 }; list<int>::iterator itL = max_element(L.begin(), L.end(), MoreThan); cout << "max_element(L) = " << *itL << endl; // 3. Пошук між цілими числами, // використовується лямбда-вираз itL = max_element(L.begin(), L.end(), [](int a, int b) { return a < b; }); cout << "min_element(L) = " << *itL << endl; }
Результат
max_element(V) = 4.5 max_element(L) = 8 min_element(L) = 8
⇑
5. Алгоритм lexicographical_compare. Порівняти поелементно 2 послідовності
Алгоритм виконує поелементне порівняння двох послідовностей, для того щоб визначити який елемент з двох послідовностей менше.
Поширені реалізації алгоритму наступні
template <class InputIterator1, class InputIterator2> bool lexicographical_compare( InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2 ); template<class InputIterator1, class InputIterator2, class Compare> bool lexicographical_compare( InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare pred );
де
- first1, last1 – ітератори, які задають діапазон елементів першої послідовності;
- first2, last2 – ітератори, які задають межі другої послідовності.
Поелементне порівняння послідовностей відбувається за наступними правилами:
- знаходяться перші 2 нерівних відповідних елементи і результат їх порівняння є результатом порівняння двох послідовностей;
- якщо елементи послідовностей рівні, тоді порівнюються довжини послідовностей. Більшою вважається та послідовніть, кількість елементів у якій більше;
- якщо послідовності ідентичні і мають однакову кількість елементів, то результатом порівняння є значення false.
Приклад.
#include <iostream> #include <queue> #include <vector> #include <list> #include <functional> #include <algorithm> using namespace std; int main() { // Алгоритм lexicographical_compare - порівнює 2 послідовності поелементно, // якщо послідовності ідентичні - результат false. // 1. Оголосити два вектори vector<double> V1 = { 1.1, 2.2, 2.7, 2.8, 3.2, 5.5 }; vector<double> V2 = { 1.1, 2.2, 2.7, 2.8, 3.2, 5.5 }; // 2. Викликати алгоритм, отримати результат bool res = lexicographical_compare(V1.begin(), V1.end(), V2.begin(), V2.end()); // 3. Обробити результат if (res) cout << "true => V1 != V2" << endl; else cout << "false => V1 == V2" << endl; }
Результат
false => V1 == V2
⇑
Споріднені теми
- Алгоритми перестановок. Алгоритми next_permutation, prev_permutation
- Немодифікуючі алгоритми. Пошук. Алгоритми find, find_if, find_first_of, find_end, adjanced_find, search, search_n
- Немодифікуючі алгоритми. Алгоритми count, count_if, equal, equal_range, mismatch
- Алгоритми для роботи з множинами. Алгоритми includes, set_union, set_intersection, set_difference, set_symmetric_difference
- Модифікуючі алгоритми. Частина 1. Алгоритми, які змінюють значення елементів послідовності. Алгоритми for_each, transform, fill, fill_n, generate, generate_n
- Модифікуючі алгоритми. Частина 2. Алгоритми обміну значеннями елементів послідовності. Алгоритми swap, swap_ranges, iter_swap
⇑