На этом шаге мы рассмотрим вспомогательные функции нахождения минимума и максимума.
Библиотека алгоритмов (заголовочный файл <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
На следующем шаге мы рассмотрим вспомогательную функцию, реализующую обмен значениями двух переменных.