C++. STL. Алгоритми визначення мінімуму і максимуму. Приклад

Алгоритми визначення мінімуму і максимуму. Приклад


Зміст


Пошук на інших ресурсах:

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

 


Споріднені теми