На этом шаге мы рассмотрим алгоритмы поиска минимального и максимального элементов.
Приведем общий вид алгоритмов, осуществляющих поиск минимума и максимума, и дадим их краткую характеристику.
InputIterator min_element (InputIterator beg, InputIterator end) InputIterator min_element (InputIterator beg, InputIterator end, CompFunc op) InputIterator max_element (InputIterator beg, InputIterator end) InputIterator max_element (InputIterator beg, Inputlterator end, CompFunc op)
Все версии алгоритмов возвращают позицию минимального или максимального элемент в интервале [beg,end).
Версии с двумя аргументами сравнивают элементы оператором <.
Операция ор определяет критерий сравнения двух элементов: op(elem1,elem2). Если первый элемент меньше второго, операция должна возвращать true.
Если в заданном интервале существует несколько элементов с минимальными или максимальными значениями, алгоритмы возвращают первый найденный элемент.
Предикат ор не должен изменять передаваемые аргументы.
Сложность линейная (numberOfElements-1 сравнений или вызовов ор соответственно).
Следующая программа выводит минимальный и максимальный элементы coll, а также элементы с минимальным и максимальным абсолютным значением (модулем):
//--------------------------------------------------------------------------- #include <vcl.h> #include "algostuff.hpp" #include <conio.h> //необходимо для getch() #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused using namespace std; std::string ToRus(const std::string &in) { char *buff = new char [in.length()+1]; CharToOem(in.c_str(),buff); std::string out(buff); delete [] buff; return out; } bool absLess (int elem1, int elem2) { return abs(elem1) < abs(elem2); } int main() { deque<int> coll; INSERT_ELEMENTS(coll,2,8); INSERT_ELEMENTS(coll,-3,5); PRINT_ELEMENTS(coll,"Исходный дек:\n"); // Вычисление и вывод минимума и максимума cout << ToRus("Минимум: ") << *min_element(coll.begin(),coll.end()) << endl; cout << ToRus("Максимум: ") << *max_element(coll.begin(),coll.end()) << endl; // Вычисление и вывод минимума и максимума // по абсолютным значениям cout << ToRus("Абсолютное значение минимума: ") << *min_element(coll.begin(),coll.end(), absLess) << endl; cout << ToRus("Абсолютное значение максимума: ") << *max_element(coll.begin(),coll.end(), absLess) << endl; getch(); return 0; } //---------------------------------------------------------------------------
Результат выполнения программы:
Рис.1. Результат работы приложения
Обратите внимание: алгоритмы возвращают позицию минимального/максимального элемента, а не значение, поэтому при выводе используется унарный оператор *.
Со следующего шага мы начнем рассматривать алгоритмы поиска элементов.