Перейти к содержимому

Include algorithm c что это

  • автор:

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 .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *