474_____________________Часть III. Современное программирование на C++
Имя параметра шаблона указывает, что sort ожидает передачи в нее итератора произвольного доступа. Этот итератор поддерживает те функции-члены, которые используются в функции sort. Двунаправленные итераторы не поддерживают эти функции-члены. Тем более их не поддерживают итераторы более низких ступеней иерархии. Если двунаправленный итератор был все же передан, компилятор выдаст некоторое непонятное сообщение из файла Bc5\Include\algorith.h. Вывод таков, что необходимо следить за типом итератора, который требует данный алгоритм, и передавать требуемый или выше рангом итератор.
Многие алгоритмы библиотеки STL имеют версии copy и/или if. Версия copy алгоритма будет помещать результаты выполнения алгоритма в другой контейнер, вместо того, чтобы замещать содержимое данного контейнера. Версия copy алгоритма помечается суффиксом copy. Версия if алгоритма использует функцию-предикат, чтобы определить, будет ли операция выполнена для данного элемента. Функция-предикат — это функция, возвращаемым значением которой является true или false, и она помечается суффиксом _if. Если алгоритм имеет обе версии — он помечается суффиксом _copy_if. Так, например, алгоритм replace имеет версии replace_if,
replace copy И replace copy if.
Другой вариант алгоритмов STL определяет способ сравнения объектов. Многие алгоритмы имеют версии, которые используют определенные для объекта операции < и ==. Другие версии для сравнения объектов принимают функции-предикаты (или объекты-функции). Функции сравнения могут быть унарными или бинарными.
Алгоритмы библиотеки STL подразделяются на категории:
• Алгоритмы, не изменяющие последовательности
• Алгоритмы, изменяющие последовательности
• Алгоритмы сортировки и связи
• Обобщенные численные алгоритмы ^
В последующих разделах алгоритм каждой из категорий описан и даны объявления для всех переменных. Кратко описаны выполняемые алгоритмами действия.
Алгоритмы, не изменяющие последовательности. Алгоритмы, не изменяющие последовательности (non-mutating sequence algorithms) не меняют содержимое контейнеров. Как следует из их названия, эти алгоритмы работают с последовательными контейнерами, такими как вектор, двусторонняя очередь и список.
for_each. Алгоритм for_each применяет функцию f к каждому элементу входной последовательности. Входная последовательность состоит из элементов контейнера между элементами first и last, причем первый включа-