Алгоритмы
Алгоритмы являются важнейшей частью стандартной библиотеки C++. Алгоритмы работают не с самими контейнерами, а с итераторами. Поэтому один и тот же алгоритм можно использовать с большинством, а то и со всеми контейнерами стандартной библиотеки C++. В этом разделе рассматриваются правила и терминология алгоритмов стандартной библиотеки C++.
Комментарии
Описания шаблонов функций алгоритма используют несколько сокращенных фраз:
Фраза "в диапазоне [A, B)" означает последовательность нулевых или более дискретных значений, начиная с A до , но не включая B. Диапазон действителен, только если B доступен из A, можно сохранить A в объекте N (N = A), можно увеличить объект ноль или более раз (++N), а объект равен B после конечного числа приращений (N == B).
Фраза "каждый N в диапазоне [A, B)" означает, что N начинается со значения A и увеличивается ноль или более раз, пока не будет равно значению B. Случай N == B не в диапазоне.
Фраза "наименьшее значение N в диапазоне [A, B) таким образом, что X" означает, что условие X определяется для каждого N в диапазоне [AB) вплоть до выполнения условия X.
Фраза "наибольшее значение N в диапазоне [A, B) таким образом, что X" означает, что условие X определяется для каждого N в диапазоне [A, B). Функция сохраняет в K копию N при каждом выполнении условия X . Если происходит такое хранение, функция заменяет конечное значение N, равное B, на значение K. Однако для итератора с двунаправленным или случайным доступом это также может означать, что N начинается с наибольшего значения в диапазоне и уменьшается по диапазону до тех пор, пока не будет выполнено условие X .
Выражения, такие как X - Y, где X и Y могут быть итераторами, отличными от итераторов произвольного доступа, предназначены в математическом смысле. Функция не обязательно вычисляет оператор - , если она должна определить такое значение. То же самое справедливо и для таких выражений, как X + N и X - N, где N — целочисленный тип.
Несколько алгоритмов используют предикат, выполняющие попарное сравнение, например, operator==
, для получения результата bool
. Функция предиката operator==
или любая ее замена не должны изменять ни один из операндов. Он должен давать один и тот же bool
результат при каждой оценке, и должен давать тот же результат, если копия любого из операндов заменяется операндом.
Некоторые алгоритмы используют предикат, который налагает строгое слабое упорядочение к парам элементов из последовательности. Для предиката pred(X, Y):
Строгий означает, что pred(X, X) имеет значение false.
Слабый означает, что X и Y имеют эквивалентный порядок, если ! pred(X, Y) && ! pred(Y, X) (X == Y не нужно определять).
Упорядочение означает, что pred(X, Y) &&pred(Y, Z) подразумевает pred(X, Z).
Некоторые из этих алгоритмов неявно используют предикат X<Y. Другие предикаты, которые обычно удовлетворяют строгому требованию к упорядочению, — это X>Y, less
(X, Y) и greater
(X, Y). Однако обратите внимание, что предикаты, такие как X<= Y и X>= Y , не удовлетворяют этому требованию.
Последовательность элементов, определяемая итераторами в диапазоне [First
, ), является последовательностью, Last
упорядоченной оператором <
, если для каждого N в диапазоне [0, Last
- First
) и для каждого M в диапазоне (N, Last
- First
) предикат !( *(First
+ M) < *(First
+ N)) имеет значение true. (Обратите внимание, что элементы сортируются по возрастанию.) Функция operator<
предиката или ее замена не должны изменять ни один из ее операндов. Он должен давать один и тот же bool
результат при каждой оценке, и должен давать тот же результат, если копия любого из операндов заменяется операндом. Кроме того она должен применить строгого слабое упорядочение с операндами, которые она сравнивает.
Последовательность элементов, обозначаемых итераторами в диапазоне [First
, Last
), представляет собой кучу, упорядоченную по operator<
, если для каждого N в диапазоне [1, Last
- First
) предикат !( *Первое< *(First
+ N)) имеет значение true. (Первый элемент является самым большим.) В противном случае его внутренняя структура известна только функциям make_heap
шаблона , pop_heap
и push_heap
. Как и в случае с упорядоченной последовательностью, функция operator<
предиката или ее замена не должны изменять ни один из своих операндов, и она должна налагать строгий слабый порядок на сравниваемых операнды. Он должен давать один и тот же bool
результат при каждой оценке, и должен давать тот же результат, если копия любого из операндов заменяется операндом.
Алгоритмы стандартной библиотеки C++ находятся в файлах заголовков <algorithm>
и <numeric>
.
См. также раздел
Справочник по стандартной библиотеке C++
Потокобезопасность в стандартной библиотеке C++