Include algorithm c что это
Определяет функции шаблона контейнера стандартной библиотеки C++, которые выполняют алгоритмы.
Синтаксис
(see links below for specific algorithm syntax)
Библиотека также использует инструкцию #include .
Замечания
Алгоритмы стандартной библиотеки C++ могут работать с различными структурами данных. Структуры данных, с которыми они могут работать, включают не только классы контейнеров стандартной библиотеки C++, такие как vector и , но и list пользовательские структуры данных и массивы элементов, если они удовлетворяют требованиям определенного алгоритма. Алгоритмы стандартной библиотеки C++ достигают такого уровня универсальности путем получения доступа к элементам контейнера и их просмотра опосредованным образом через итераторы.
Алгоритмы стандартной библиотеки C++ обрабатывают диапазоны итератора, которые обычно определяются их начальными или конечными позициями. Диапазоны, упомянутые ниже, должны быть допустимыми в том смысле, что все итераторы в диапазонах должны быть разыменовываемыми и в пределах последовательностей каждого диапазона, последняя позиция должна быть достигнута с первого, добавив итератор.
Алгоритмы стандартной библиотеки C++ могут работать с различными типами объектов контейнеров одновременно. Два суффикса использовались для передачи информации о назначении алгоритмов:
- Суффикс _if указывает, что алгоритм используется с объектами-функциями, которые работают над значениями элементов, а не на самих элементах. Например, find_if алгоритм ищет элементы, значения которых удовлетворяют критерию, заданному объектом-функцией, а find алгоритм выполняет поиск определенного значения.
- Суффикс _copy указывает, что алгоритм обычно изменяет скопированные значения, а не копирует измененные значения. Другими словами, они не изменяют элементы исходного диапазона, но помещают результаты в выходной диапазон или итератор. Например, reverse алгоритм изменяет порядок элементов в диапазоне, а reverse_copy алгоритм копирует обратный результат в диапазон назначения.
Алгоритмы стандартной библиотеки C++ часто классифицируются в группы, чтобы указать их назначение или требования. К ним относятся изменения алгоритмов, которые изменяют значение элементов по сравнению с не изменяющимися алгоритмами, которые не изменяются. Изменяющие алгоритмы меняют порядок элементов, но не значения элементов. Удаляющие алгоритмы могут исключать элементы из диапазона или копии диапазона. Алгоритмы сортировки переупорядочения элементов в диапазоне различными способами и отсортированные алгоритмы диапазона действуют только для диапазонов, элементы которых были отсортированы определенным образом.
Алгоритмы
| Имя | Описание |
|---|---|
| adjacent_find | Поиск двух соседних элементов, которые либо равны, либо удовлетворяют указанному условию. |
| all_of | Возвращает значение true , если условие выполняется каждым элементом заданного диапазона. |
| any_of | Возвращает значение true , если условие выполняется хотя бы один раз в указанном диапазоне элементов. |
| binary_search | Проверяет, есть ли в отсортированном диапазоне элемент, равный указанному значению или эквивалентный ему в смысле, заданном двоичным предикатом. |
| clamp | |
| copy | Присваивает значения элементов из исходного диапазона диапазону назначения, выполняя итерации в исходной последовательности элементов и присваивая им новые позиции в прямом направлении. |
| copy_backward | Присваивает значения элементов из исходного диапазона диапазону назначения, выполняя итерации в исходной последовательности элементов и присваивая им новые позиции в обратном направлении. |
| copy_if | Копирует все элементы в заданном диапазоне, возвращающие true для заданного условия |
| copy_n | Копирует указанное количество элементов. |
| count | Возвращает количество элементов в диапазоне, значения которых соответствуют заданному значению. |
| count_if | Возвращает количество элементов в диапазоне, значения которых соответствуют заданному условию. |
| equal | Сравнивает два диапазона поэлементно либо на признак равенства или равноценности в смысле, заданном бинарным предикатом. |
| equal_range | Находит пару позиций в упорядоченном диапазоне; первая из них меньше или равна позиции указанного элемента, а вторая — больше позиции элемента, где суть равноценности или порядка, используемая, чтобы установить позиции в последовательности, может быть задана бинарным предикатом. |
| fill | Присваивает одно и то же новое значение каждому элементу в заданном диапазоне. |
| fill_n | Присваивает новое значение указанному количеству элементов в диапазоне, начиная с определенного элемента. |
| find | Находит позицию первого вхождения элемента с заданным значением в диапазон. |
| find_end | Ищет в диапазоне последнюю подпоследовательность, совпадающую с заданной последовательностью, или эквивалентной согласно условию, заданному двоичным предикатом. |
| find_first_of | Выполняет поиск первого вхождения любого из нескольких значений в заданный диапазон или первого вхождения любого из нескольких элементов, равноценных в смысле, заданном бинарным предикатом, в указанный набор элементов. |
| find_if | Находит позицию первого вхождения элемента, удовлетворяющего определенному условию, в диапазон. |
| find_if_not | Возвращает первый элемент в указанном диапазоне, который не удовлетворяет условию. |
| for_each | Применяет заданный объект функции к каждому элементу в прямом порядке в пределах диапазона и возвращает объект функции. |
| for_each_n | |
| generate | Присваивает значения, создаваемые объектом функции, каждому элементу в диапазоне. |
| generate_n | Присваивает значения, создаваемые объектом функции, указанному количеству элементов в диапазоне и возвращается на позицию, следующую за последним присвоенным значением. |
| includes | Проверяет, содержит ли один отсортированный диапазон все элементы, содержащиеся во втором отсортированном диапазоне, где порядок сортировки или критерий эквивалентности элементов можно задать бинарным предикатом. |
| inplace_merge | Объединяет элементы из двух последовательных упорядоченных диапазонов в один упорядоченный диапазон, где критерий порядка сортировки может быть указан бинарным предикатом. |
| is_heap | Возвращает значение true , если элементы в указанном диапазоне образуют кучу. |
| is_heap_until | Возвращает значение true , если указанный диапазон образует кучу до последнего элемента. |
| is_partitioned | Возвращает значение true , если все элементы в заданном диапазоне, возвращающие true для какого-либо условия, расположены перед всеми элементами, возвращающими false . |
| is_permutation | Определяет, образуют ли элементы в заданном диапазоне допустимую перестановку. |
| is_sorted | Возвращает значение true , если элементы в указанном диапазоне расположены в порядке сортировки. |
| is_sorted_until | Возвращает значение true , если элементы в указанном диапазоне расположены в порядке сортировки. |
| iter_swap | Меняет местами два значения, указанные парой определенных итераторов. |
| lexicographical_compare | Сравнивает две последовательности поэлементно для определения того, какой элемент из двух меньше. |
| lower_bound | Находит позицию первого элемента в упорядоченном диапазоне, значение которого больше или равно указанному значению, где критерий упорядочивания может быть задан бинарным предикатом. |
| make_heap | Преобразует элементы из указанного диапазона в кучу, в которой первый элемент является наибольшим и для которой критерий сортировки может быть определен бинарным предикатом. |
| max | Сравнивает два объекта и возвращает больший из них, где критерий упорядочивания может быть указан бинарным предикатом. |
| max_element | Находит первое вхождение наибольшего элемента в указанном диапазоне, где критерий упорядочивания может быть указан бинарным предикатом. |
| merge | Объединяет все элементы из двух исходных упорядоченных диапазонов в один упорядоченный диапазон назначения, где критерий порядка сортировки может быть указан бинарным предикатом. |
| min | Сравнивает два объекта и возвращает меньший из них, где критерий упорядочивания может быть указан бинарным предикатом. |
| min_element | Находит первое вхождение наименьшего элемента в указанном диапазоне, где критерий упорядочивания может быть указан бинарным предикатом. |
| minmax | Сравнивает два входных параметра и возвращает их в виде пары, в порядке от меньшего к большему. |
| minmax_element | Выполняет работу, которую делают min_element и max_element , в одном вызове. |
| mismatch | Сравнивает два диапазона поэлементно либо на равенство или равноценность в смысле, заданном бинарным предикатом, и находит первую позицию, где наблюдается разница. |
| move | Перемещает элементы, связанные с заданным диапазоном. |
| move_backward | Перемещает элементы одного итератора в другой. Перемещение начинается с последнего элементом в указанном диапазоне и завершается первым элементом в этом диапазоне. |
| next_permutation | Изменяет порядок элементов в диапазоне, чтобы исходный порядок был заменен перестановкой «лексикографически следующий больший», если такая существует, где смысл термина «следующий» может быть задан бинарным предикатом. |
| none_of | Возвращает значение true , если условие не выполняется ни одним элементом заданного диапазона. |
| nth_element | Разделяет диапазон элементов, правильно находя n-й элемент последовательности в диапазоне, чтобы все элементы перед ним были меньше или равны ему, а все элементы в последовательности после него больше либо равны ему. |
| partial_sort | Упорядочивает указанное число меньших элементов в диапазоне в не нисходящий порядок или согласно критерию упорядочивания, заданному бинарным предикатом. |
| partial_sort_copy | Копирует элементы из исходного диапазона в диапазон назначения, где исходные элементы упорядочены по критерию «меньше либо равно» или согласно другому заданному бинарному предикату. |
| partition | Разделяет элементы диапазона на два непересекающихся множества, при этом элементы, удовлетворяющие унарному предикату, расположены перед теми, которые ему не удовлетворяют. |
| partition_copy | Копирует элементы, возвращающие true для какого-либо условия, в одно место назначения, а возвращающие false — в другое. Эти элементы должны поступать из указанного диапазона. |
| partition_point | Возвращает первый элемент в заданном диапазоне, который не удовлетворяет условию. Элементы сортируются таким образом, чтобы те, которые удовлетворяют условию, приходят до тех, которые не имеют. |
| pop_heap | Удаляет наибольший элемент из начала кучи до позиции, следующей за последней, в диапазоне, а затем формирует новую кучу из оставшихся элементов. |
| prev_permutation | Изменяет порядок элементов в диапазоне, чтобы исходный порядок был заменен перестановкой «лексикографически следующий больший», если такая существует, где смысл термина «следующий» может быть задан бинарным предикатом. |
| push_heap | Добавляет элемент, находящийся в конце диапазона, в существующую кучу, состоящую из предыдущих элементов диапазона. |
| random_shuffle | Выполняет переупорядочивание последовательности N элементов в диапазоне в одном из N! возможных порядков, выбранном случайным образом. |
| remove | Удаляет указанное значение из заданного диапазона без нарушения порядка остальных элементов и возвращает конец нового диапазона после удаления указанного значения. |
| remove_copy | Копирует элементы из исходного диапазона в диапазон назначения, за исключением того, что элементы указанного значения не копируются, не нарушая порядок оставшихся элементов и возвращая конец нового диапазона назначения. |
| remove_copy_if | Копирует элементы из исходного диапазона в диапазон назначения, за исключением того, что выполнение предиката не копируется, не нарушая порядок оставшихся элементов и возвращая конец нового диапазона назначения. |
| remove_if | Удаляет элементы, соответствующие предикату, из заданного диапазона без нарушения порядка остальных элементов и возвращает конец нового диапазона после удаления указанного значения. |
| replace | Проверяет каждый элемент в диапазоне и заменяет его, если он соответствует заданному значению. |
| replace_copy | Проверяет каждый элемент в исходном диапазоне и заменяет его, если он соответствует заданному значению, одновременно копируя результат в новый диапазон назначения. |
| replace_copy_if | Проверяет каждый элемент в исходном диапазоне и заменяет его, если он соответствует заданному предикату, одновременно копируя результат в новый диапазон назначения. |
| replace_if | Проверяет каждый элемент в диапазоне и заменяет его, если он соответствует заданному предикату. |
| reverse | Изменяет порядок элементов в диапазоне на обратный. |
| reverse_copy | Изменяет порядок элементов в исходном диапазоне на обратный, одновременно копируя их в диапазон назначения |
| rotate | Меняет местами элементы в двух соседних диапазонах. |
| rotate_copy | Меняет местами элементы в двух соседних диапазонах в пределах исходного диапазона и копирует результат в диапазон назначения. |
| sample | |
| search | Выполняет поиск первого вхождения последовательности в целевой диапазон, элементы которого равны указанным в заданной последовательности элементов или элементы которого равноценны в смысле, заданным бинарным предикатом, элементам в заданной последовательности. |
| search_n | Выполняет поиск первой подпоследовательности в диапазоне заданного числа элементов, имеющих определенное значение или связанных с этим значением отношением, указанным бинарным предикатом. |
| set_difference | Объединяет все элементы, принадлежащие одному отсортированному исходному диапазону, но не второму отсортированному исходному диапазону, в один отсортированный диапазон назначения, где критерий упорядочивания может быть указан бинарным предикатом. |
| set_intersection | Объединяет все элементы, входящие в оба исходных упорядоченных диапазона, в один упорядоченный диапазон назначения, где критерий порядка сортировки может быть указан бинарным предикатом. |
| set_symmetric_difference | Объединяет все элементы, входящие в один, но не в оба исходных упорядоченных диапазона, в один упорядоченный диапазон назначения, где критерий порядка сортировки может быть указан бинарным предикатом. |
| set_union | Объединяет все элементы, входящие в хотя бы один из двух исходных упорядоченных диапазонов, в один упорядоченный диапазон назначения, где критерий порядка сортировки может быть указан бинарным предикатом. |
| sort | Упорядочивает элементы в указанном диапазоне в не нисходящем порядке или согласно критерию упорядочивания, заданному бинарным предикатом. |
| shuffle | Перемешивает (изменяет порядок) элементы в указанном диапазоне, используя генератор случайных чисел. |
| sort_heap | Преобразует кучу в упорядоченный диапазон. |
| stable_partition | Разделяет элементы диапазона на два непересекающихся множества, при этом элементы, удовлетворяющие унарному предикату, расположены перед теми, которые ему не удовлетворяют, с сохранением относительного порядка равноценных элементов. |
| stable_sort | Упорядочивает элементы в указанном диапазоне в не нисходящем порядке или согласно критерию упорядочивания, заданному бинарным предикатом, и сохраняет относительный порядок равноценных элементов. |
| swap | Меняет местами значения элементов между двумя типами объектов, присваивая содержимое первого объекта второму объекту, а содержимое второго — первому. |
| swap_ranges | Меняет местами элементы одного диапазона с элементами другого диапазона такого же размера. |
| transform | Применяет заданный объект функции к каждому элементу в исходном диапазоне или к паре элементов из двух исходных диапазонов и копирует возвращаемые значения объекта функции в диапазон назначения. |
| unique | Удаляет повторяющиеся элементы, которые находятся рядом друг с другом в указанном диапазоне. |
| unique_copy | Копирует элементы из исходного диапазона в диапазон назначения, за исключением повторяющихся элементов, которые находятся рядом друг с другом. |
| upper_bound | Находит позицию первого элемента в упорядоченном диапазоне, который имеет значение больше указанного значения, где критерий упорядочивания может быть задан бинарным предикатом. |
Алгоритмы стандартной библиотеки C++
Стандартная библиотека содержит большое количество алгоритмов для работы с контейнерами стандартной библиотеки. Доступные инструменты покрывают значительную часть встречающихся алгоритмических задач. Использование стандартных алгоритмов вместо их самостоятельной реализации является хорошим стилем программирования по следующим причинам:
- Экономия времени. Мы не тратим время на реализацию и отладку алгоритма.
- Гарантия отсутствия ошибок в логике работы алгоритма. Алгоритмы стандартной библиотеки протестированы многими программистами.
- Лаконичность и выразительность кода. Вместо некоторого количества строчек, которые выполняют неочевидные манипуляции, мы видим название хорошо документированного алгоритма.
Мы рассмотрим лишь некоторые из доступных алгоритмов. Полный список можно найти в документации. Мы рекомендуем всегда проверять наличие стандартного решения при встрече с алгоритмической задачей.
iota, for_each и transform
Большое количество циклов for в коде, который выполняет манипуляции со структурами данных, обычно говорит о недостаточном использовании стандартных алгоритмов. Так, если необходимо применить некоторую функцию ко всем элементам контейнера, то можно рассмотреть использование алгоритма for_each .
Решим следующую задачу: вывести в стандартный поток квадраты натуральных чисел от 1 до 100. Следующий код показывает, что эта задача может быть решена в четырех строчках кода и без явного использования циклов:
#include #include #include // iota #include // for_each using namespace std; int main() vectorint> v(100); iota(v.begin(), v.end(), 1); // v = [1, 2, 3, . 100] for_each(v.begin(), v.end(), [](int& a)a = a*a;>); // v = [1, 4, 9, . 10000] for_each(v.begin(), v.end(), [](int a)cout <a <' ';>); return 0; >
Мы воспользовались алгоритмом iota из библиотеки , чтобы проинициализировать массив набором последовательных целых чисел. Затем мы два раза использовали алгоритм for_each : для вычисления квадратов и для вывода значений в стандартный поток.
Третьим аргументом алгоритм for_each принимает функцию одного аргумента. Тип аргумента должен соответствовать типу элементов контейнера. Вместо обычной функции бывает удобно передать лямбда-выражение, что мы и сделали оба раза в этом примере. Лямбда-выражение позволяет определить функцию в месте ее использования. Квадратные скобки [] указывают на начало лямбда-выражения; в круглых скобках указываются аргументы выражения; в фигурных скобках содержится тело лямбда-выражения.
Модифицируем немного нашу задачу. Предположим, что мы не хотим изменять исходный вектор, а значения квадратов хотим сохранить в другом векторе. Алгоритм transform позволяет выполнить такое преобразование:
#include #include #include // iota #include // for_each, transform using namespace std; int main() vectorint> source(100); iota(source.begin(), source.end(), 1); // v = [1, 2, 3, . 100] vectorint> target(source.size()); transform(source.begin(), source.end(), target.begin(), [](int& a)return a*a;>); // v = [1, 4, 9, . 10000] for_each(target.begin(), target.end(), [](int a)cout <a <' ';>); return 0; >
Третьим аргументом алгоритм transform принимает итератор на место целевого контейнера, с которого нужно начать заполнять значения. Обратите внимание, что мы заранее инициализировали вектор target нужной длины.
all_of, any_of, none_of
Довольно часто возникает задача проверки какого-либо условия для всех объектов контейнера. Здесь на помощь приходят алгоритмы all_of , any_of и none_of с очевидным поведением, которые принимают диапазон значений и унарный предикат — функцию одного аргумента, которая возвращает true или false . Так, например, можно проверить содержит ли множество хотя бы один отрицательный элемент:
setdouble> s1.1, -0.9, 2.4, 10.1, 3.1415>; bool neg_in_set = any_of(s.begin(), s.end(), [](double x)return x 0;>); // true
Вторая строчка этого примера не поменяется, если вместо контейнера set будет использован другой контейнер, например, list , vector , array или unordered_set .
count, count_if, find, find_if
Алгоритм count позволяет посчитать количество элементов в контейнере, равных заданному. Модификация этого алгоритма count_if подсчитывает количество элементов, удовлетворяющих определенному условию. Рассмотрим следующий пример: мы имеем дело с историей авторизации пользователей на сайте, которая хранится в виде вектора строк. Каждая строка — это логин пользователя. Подсчитаем сколько раз авторизовывался пользователь с логином david:
vectorstring> history = /*. */>; size_t david_count = count(history.begin(), history.end(), "david");
Если нам захочется удалить запись для логина david, мы можем это сделать с помощью алгоритма find и метода vector::erase :
if (auto item = find(history.begin(), history.end(), "david"); item != history.end()) history.erase(item); >
Алгоритм find возвращает итератор на найденный элемент. Версия алгоритма find_if позволяет найти первый элемент, удовлетворяющий некоторому условию.
Как и другие алгоритмы, find и count могут работать с контейнерами разных типов. Они проходят переданный диапазон значений последовательно, начиная с первого элемента. Использование такого подхода для контейнеров set и map — плохая идея, ведь они созданы для того чтобы выполнять поиск объектов быстрее. Это общее правило: если контейнер имеет метод, аналогичный общему алгоритму, то следуем использовать метод контейнера. В большинстве случаев это даст выигрыш в производительности.
sort, stable_sort, nth_element
Алгоритмы сортировки — это важный и интересный раздел теории алгоритмов. Работать с отсортированными элементами во многих ситуациях удобнее, в частности, сложность поиска элементов становится логарифмической вместо линейной. Стандартная библиотека C++ предлагает алгоритмы sort и stable_sort , которые выполняют сортировку за время, пропорциональное N log(N), где N — количество элементов массива. Стабильная сортировка stable_sort при этом гарантирует, что равные объекты не меняют своего относительного положения в контейнере.
Рассмотрим простой пример сортировки:
vectorstring> v "David", "Ivan", "Adam", "Dmitry">; sort(v.begin(), v.end()); // ["Adam", "David", "Dmitry", "Ivan"]
bool string_cmp(const string& lhs, const string& rhs) return lhs.size() > rhs.size(); > vectorstring> v "David", "Ivan", "Adam", "Dmitry">; stable_sort(v.begin(), v.end(), string_cmp); // ["Dmitry", "David", "Ivan", "Adam"]
Мы использовали стабильную версию сортировки. В этом случае Ivan гарантировано окажется левее Adam в отсортированном векторе.
Оказывается, что задача поиска n-го элемента (как если бы элементы стояли по порядку по какому-либо признаку) может быть решена быстрее, чем сортировка всего массива — за линейное время. Стандартная библиотека предлагает алгоритм nth_element для решения этой задачи.
lower_bound, upper_bound, binary_search
Коль скоро мы научились получать отсортированные массивы, рассмотрим алгоритмы для поиска элементов в них. Алгоритмы lower_bound и upper_bound позволяют найти в отсортированном массиве первый элемент не меньше данного и первый элемент больше данного, соответственно. Эти алгоритмы возвращают итератор, соответствующий найденному элементу.
Алгоритм binary_search проверяет, есть ли в отсортированном массиве данный элемент и возвращает true или false в зависимости от результата поиска.
Все три алгоритма выполняются за логарифмическое время.
Резюме
В этом материале мы рассмотрели примеры использования нескольких основных алгоритмов стандартной библиотеки C++. Обсудили, что применение стандартных алгоритмов является хорошим стилем программирования, позволяет писать код быстрее, и делает его более легким для прочтения.
Полезные алгоритмы стандартной библиотеки не ограничиваются рассмотренными выше. Мы рекомендуем посмотреть на полный список доступных алгоритмов, среди которых можно обратить внимание на алгоритмы copy , remove , generate и partition , которые вполне могут пригодиться.
Конечно, мы не ожидаем, что после прочтения этого материала вы сразу начнете свободно применять разнообразные алгоритмы. Только с практикой использование алгоритмов становится естественным и полезным инструментом разработки.
Документация
- https://en.cppreference.com/w/cpp/algorithm
- http://www.cplusplus.com/reference/algorithm/
- https://en.cppreference.com/w/cpp/language/lambda
Алгоритм includes()
includes() проверяет, каждый ли элемент последовательности [first1,last1) входит в последовательность [first2,last2). Первый вариант предполагает, что последовательности отсортированы в порядке, определяемом оператором “меньше”; второй — что порядок задается параметром-типом comp.
// алгоритму includes следует передавать отсортированные контейнеры
sort( ia1, ia1+12 ); sort( ia2, ia2+6 );
// печатает: каждый элемент ia2 входит в ia1? Да
bool res = includes( ia1, ia1+12, ia2, ia2+6 );
cout «каждый элемент ia2 входит в ia1? «
(res ? «Да» : «Нет») endl;
vector int, allocator ivect1( ia1, ia1+12 );
vector int, allocator ivect2( ia2, ia2+6 );
// отсортирован в порядке убывания
sort( ivect1.begin(), ivect1.end(), greaterint() );
sort( ivect2.begin(), ivect2.end(), greaterint() );
res = includes( ivect1.begin(), ivect1.end(),
// печатает: каждый элемент ivect2 входит в ivect1? Да
cout «каждый элемент ivect2 входит в ivect1? «
(res ? «Да» : «Нет») endl;
Читайте также
8.1.1 Алгоритм
8.1.1 Алгоритм Сразу после переключения контекста ядро запускает алгоритм планирования выполнения процессов (Рисунок 8.1), выбирая на выполнение процесс с наивысшим приоритетом среди процессов, находящихся в состояниях «резервирования» и «готовности к выполнению, будучи
Алгоритм inplace_merge()
Алгоритм inplace_merge() template class BidirectionalIterator voidinplace_merge( BidirectionalIterator first,BidirectionalIterator middle,BidirectionalIterator last );template class BidirectionalIterator, class Compare voidinplace_merge( BidirectionalIterator first,BidirectionalIterator middle,BidirectionalIterator last, Compare comp );inplace_merge() объединяет две соседние отсортированные последовательности,
Алгоритм iter_swap()
Алгоритм iter_swap() template class ForwardIterator1, class ForwardIterator2 voiditer_swap( ForwardIterator1 a, ForwardIterator2 b );iter_swap() обменивает значения элементов, на которые указывают итераторы a и b.#include algorithm#include list#include iostream.hint main();list int,allocator ilist( ia, ia+6 );typedef list int, allocator ::iterator iterator;iterator iter1 =
Алгоритм lexicographical_compare()
Алгоритм lexicographical_compare() template class InputIterator1, class InputIterator2 boollexicographical_compare(InputIterator1 first1, InputIterator1 last1,InputIterator1 first2, InputIterator2 last2 );template class InputIterator1, class InputIterator2,class Compare boollexicographical_compare(InputIterator1 first1, InputIterator1 last1,InputIterator1 first2, InputIterator2 last2,Compare comp );lexicographical_compare() сравнивает соответственные пары
Алгоритм lower_bound()
Алгоритм lower_bound() template class ForwardIterator, class Type ForwardIteratorlower_bound( ForwardIterator first,ForwardIterator last, const Type &value );template class ForwardIterator, class Type, class Compare ForwardIteratorlower_bound( ForwardIterator first,ForwardIterator last, const Type &value,class Compare );lower_bound() возвращает итератор, указывающий на первую позицию в отсортированной
Алгоритм max()
Алгоритм max() template class Type const Type&max( const Type &aval, const Type &bval );template class Type, class Compare const Type&max( const Type &aval, const Type &bval, Compare comp );max() возвращает наибольшее из двух значений aval и bval. В первом варианте используется оператор «больше», определенный в классе Type; во втором — операция
Алгоритм min()
Алгоритм min() template class Type const Type&min( const Type &aval, const Type &bval );template class Type, class Compare const Type&min( const Type &aval, const Type &bval, Compare comp );min() возвращает меньшее из двух значений aval и bval. В первом варианте используется оператор “меньше”, определенный для типа Type; во втором — операция
Алгоритм merge()
Алгоритм merge() template class InputIterator1, class InputIterator2,class OutputIterator OutputIteratormerge( InputIterator1 first1, InputIterator1 last1,InputIterator2 first2, InputIterator2 last2,OutputIterator result );template class InputIterator1, class InputIterator2,class OutputIterator, class Compare OutputIteratormerge( InputIterator1 first1, InputIterator1 last1,InputIterator2 first2, InputIterator2 last2,OutputIterator result, Compare comp );merge() объединяет
Алгоритм mismatch()
Алгоритм mismatch() template class InputIterator1, class InputIterator2 pairInputIterator1, InputIterator2mismatch( InputIterator1 first,InputIterator1 last, InputIterator2 first2 );template class InputIterator1, class InputIterator2,class BinaryPredicate pairInputIterator1, InputIterator2mismatch( InputIterator1 first, InputIterator1 last,InputIterator2 first2, BinaryPredicate pred );mismatch() сравнивает две последовательности и находит
Алгоритм nth_element()
Алгоритм nth_element() template class RandomAccessIterator voidnth_element( RandomAccessIterator first,RandomAccessIterator nth,RandomAccessIterator last );template class RandomAccessIterator, class Compare voidnth_element( RandomAccessIterator first,RandomAccessIterator nth,RandomAccessIterator last, Compare comp );nth_element() переупорядочивает последовательность, ограниченную диапазоном [first,last), так что все
Алгоритм partial_sort()
Алгоритм partial_sort() template class RandomAccessIterator voidpartial_sort( RandomAccessIterator first,RandomAccessIterator middle,RandomAccessIterator last );templatepartial_sort() сортирует часть последовательности, укладывающуюся в диапазон [first,middle). Элементы в диапазоне [middle,last) остаются неотсортированными. Например, если дан массивint ia[] =
Алгоритм partial_sum()
Алгоритм partial_sum() template class InputIterator, class OutputIterator OutputIteratorpartial_sum(InputIterator first, InputIterator last,OutputIterator result );template class InputIterator, class OutputIterator,class BinaryOperation OutputIteratorpartial_sum(InputIterator first, InputIterator last,OutputIterator result, BinaryOperation op );Первый вариант partial_sum() создает из последовательности, ограниченной
Алгоритм partition()
Алгоритм partition() template class BidirectionalIterator, class UnaryPredicate BidirectionalIteratorpartition(BidirectionalIterator first,BidirectionalIterator last, UnaryPredicate pred );partition() переупорядочивает элементы в диапазоне [first,last). Все элементы, для которых предикат pred равен true, помещаются перед элементами, для которых он равен false.
Алгоритм random_shuffle()
Алгоритм random_shuffle() template class RandomAccessIterator voidrandom_shuffle( RandomAccessIterator first,RandomAccessIterator last );template class RandomAccessIterator,class RandomNumberGenerator voidrandom_shuffle( RandomAccessIterator first,RandomAccessIterator last,RandomNumberGenerator rand);random_shuffle() переставляет элементы из диапазона [first,last) в случайном порядке. Во втором варианте можно
Алгоритмы стандартной библиотеки C++
Заголовочный файл algorithm содержит много полезных алгоритмов.
Большинство из этих алгоритмов принимают в качестве параметра два итератора, будем обозначать их first и last. В этом случае алгоритм работает с элементами контейнера от first включительно до last невключительно. Чаще всего в качестве first используется метод begin(), а в качестве last — метод end(), в этом случае алгоритм применяется ко всему контейнеру. Например,
Используя операции «+» и «-» для итераторов можно применять алгоритмы не для всего контейнера, а для части.
Можно передавать также reverse_iteraror, наиболее употребительный способ использования — это сортировка в обратном порядке при помощи:
Алгоритмы поиска
find
Алгоритм find(first, last, val) осуществляет линейный поиск значения val от итератора first до итератора last . Элементы просматриваются последовательность, возвращается итератор на первый найденный элемент. Если элемент val не будет найден, то возвращается значение итератора last .
binary_search
Алгоритм binary_search(first, last, val) осуществляет двоичный поиск значения val . Контейнер должен быть упорядочен. Возвращается значение типа bool , то есть true или false в зависимости от того, есть ли такой элемент в контейнере.
lower_bound
Алгоритм lower_bound(first, last, val) осуществляет двоичный поиск значения val и возвращает итератор res на первый элемент, который не меньше, чем val , то есть *res>=val , a *(res-1)
upper_bound
Алгоритм upper_bound(first, last, val) осуществляет двоичный поиск значения val и возвращает итератор res на первый элемент, который строго больше, чем val , то есть *res>val , a *(res-1)
Алгоритмы сортировки, разворота, сдвига
sort
sort(first, last) — упорядочивает элементы контейнера по неубыванию.
stable_sort
sort(first, last) — упорядочивает элементы контейнера по неубыванию, при этом равные элементы не переставляются (так называемая «устойчивая сортировка»).
reverse
reverse(first, last) — разворачивает фрагмент контейнера в обратном порядке, переставляя элементы, равноудаленные от концов.
rotate
reverse(first, n_first, last) — осуществляет циклический сдвиг фрагмента контейнера. Элемент, на который указывает итератор n_first становится первым элементом (то есть переходит на место элемента first ), элемент n_first+1 — вторым и т.д.
Перестановки
next_permutation
next_permutation(first, last) — переставляет элементы так, чтобы получилась следующая в лексикографическом порядке перестановка. Можно применять не только к векторам, но и к строкам (как и многие другие алгоритмы). Метод возвращает true , если удалось построить следующую в лексикографическом порядке перестановку. Если же первоначальная перестановка уже была максимальной в лексикографическом порядке, то метод генерирует минимальную в лексикографическом порядке перестановку и возвращает false .
Например, вывести все перестановки в лексикографическом порядке можно так:
prev_permutation
prev_permutation(first, last) — переставляет элементы так, чтобы получилась предыдущая в лексикографическом порядке перестановка. Можно применять не только к векторам, но и к строкам (как и многие другие алгоритмы). Метод возвращает true , если удалось построить предыдущую в лексикографическом порядке перестановку. Если же первоначальная перестановка уже была минимальной в лексикографическом порядке, то метод генерирует максимальную в лексикографическом порядке перестановку и возвращает false .
random_shuffle
random_shuffle(first, last) — делает случайную перестановку элементов контейнера.
Минимальные и максимальные элементы, подсчет
min_element
Алгоритм min_element(first, last) находит минимальный элемент в контейнере и возвращает итератор на этот элемент. Если есть несколько элементов, равных минимальному, возвращается значение первого из них.
max_element
max_element(first, last) возвращает итератор на наибольший элемент. Если есть несколько элементов, равных наибольшему — то на первый из них.
count
count(first, last, val) — подсчитывает сколько элементов контейнера равны значению val .