Шаг 77.
Библиотека STL. Вспомогательные средства. Вспомогательные функции. Вычисление минимума и максимума

    На этом шаге мы рассмотрим вспомогательные функции нахождения минимума и максимума.

    Библиотека алгоритмов (заголовочный файл <algorithm>) включает три вспомогательные функции. Первые две функции вычисляют минимум и максимум по двум величинам, а третья меняет местами два значения.

Вычисление минимума и максимума

    Функции, вычисляющие минимум и максимум по двум величинам, определяются в заголовочном файле <algorithm>:

namespace std {
  template <class T>
  inline const T& min (const T& a, const T& b) { 
    return b < a ? b : a;
  }

  template <class T>
  inline const T& max (const T& a, const T& b) { 
    return a < b ? b : a;
  }
}

    Если значения равны, функции обычно возвращают первый элемент. Тем не менее работа программы не должна зависеть от данного факта - это считается проявлением плохого стиля программирования.

    Обе функции также могут вызываться с дополнительным аргументом, определяющим критерий сравнения:

namespace std {
  template <class T, class Compare>
  inline const T& min (const T& a, const T& b, Compare comp) {
    return comp(b,a) ? b : a; 
  }

  template <class T, class Compare>
  inline const T& max (const T& a, const T& b, Compare comp) { 
    return comp(a,b) ? b : a;
  }
}

    В качестве дополнительного аргумента передается функция или объект функции, который проверяет, предшествует ли первая величина второй в некотором заданном порядке.

    Пример использования функции max() с передачей функции сравнения:

#include <algorithm> 
using namespace std;
// Функция сравнивает два указателя путем сравнения значений.
// на которые они ссылаются.
bool int_ptr_less (int* a, int* b)
{
  return *a < *b;
}

int main() 
{
  int x = 17;
  int y = 42;
  int* px = &x:
  int* py = &y;
  int* pmax;

  // Вызов max() с передачей функции сравнения 
  pmax = max (px, py, int_ptr_less);
  .    .    .    .
}

    Учтите, что определения min() и max() требуют совпадения типов. Следовательно, эти функции не могут использоваться для объектов разных типов:

  int i; 
  long l;
  .    .    .    .
  l = std::max(i,l);  // ОШИБКА: разнотипные аргументы

    С другой стороны, вы можете явно задать типы аргументов (а следовательно, и возвращаемого значения):

  l = std::max<long>(i,l);   // OK

    На следующем шаге мы рассмотрим вспомогательную функцию, реализующую обмен значениями двух переменных.




Предыдущий шаг Содержание Следующий шаг