
- •Стандартные алгоритмы
- •Обрабатываемые последовательности
- •Нечто, что может быть вызвано как функция
- •Алгоритмы сортировки
- •Сортировка (sort)
- •Устойчивая сортировка (stable_sort)
- •Частичная сортировка (partial_sort)
- •Частичная сортировка с копированием (partial_sort_copy)
- •N-й элемент (nth_element)
- •Алгоритмы поиска
- •Нижняя граница (lower_bound)
- •Верхняя граница (upper_bound)
- •Область вставки (equal_range)
- •Двоичный поиск (binary_search)
Стандартные алгоритмы
Помимо контейнеров стандартная библиотека содержит большое количество алгоритмов (около 60). Алгоритм STL– это алгоритм в прямом смысле слова, т.е. некоторая операция, выполняемая над некоторыми данными. Все алгоритмы обрабатывают данные представленные в виде последовательности, заданной двумя итераторами. Это означает, что алгоритмыSTLмогут обрабатывать как содержимое стандартных контейнеровSTL, так и нестандартных (но совместимых с ними), а также любой последовательности представленной паройSTLсовместимых итераторов.
Преимущество данного подхода заключается в том, что реализация алгоритма не содержит никакой информации о структуре обрабатываемых данных, помимо того, что они являются последовательностью. Все алгоритмы являются шаблонами функции и могут быть применены к различным типам аргументов. Так например, с помощью рассмотренного в одной из предыдущих работ алгоритма copy, можно скопировать содержимое одного контейнера в другой, или прямо на стандартный вывод, передав в качестве третьего параметра (итератор, указывающий последовательность, в которую осуществляется копирование) итератор вывода в стандартный поток.
// программа выводит латинский алфавит
#include "stdafx.h"
#include <vector>
#include <iterator>
#include <iostream>
using namespace std;
int main (int, char**)
{
vector<char> VectorOfInt;
int i;
for (i = 0; i < 26; i++)
{
VectorOfInt.push_back('a' + i);
VectorOfInt.push_back(' ');
}
copy(VectorOfInt.begin(),
VectorOfInt.end(),
ostream_iterator<char>(cout));
return 0;
}
Стандартные алгоритмы осуществляют такие часто встречающиеся действия, как поиск, подсчет, замену, удаление, различные виды сортировки. При этом все стандартные алгоритмы можно разделить на две группы: модифицирующие последовательность и немодифицирующие последовательность. Обычно среди модифицирующих алгоритмов выделяют алгоритмы сортировки.
Объявления всех стандартных алгоритмов находится в заголовочном файле <algorithm>
Обрабатываемые последовательности
Необходимо отметить, что всестандартные алгоритмы, принимают в качестве обрабатываемой последовательности, последовательность вида [iterator_first;iterator_last), гдеiterator_first– итератор указывающий на первый элемент последовательности,iterator_last– итератор, указывающий на элемент последовательности, следующий за последним (законечный элемент).
Также необходимо отметить, что алгоритмы не осуществляют проверку переданных им данных, т.е. переданные стандартным алгоритмам последовательности должны быть действительными, iterator_lastдолжен быть достижим изiterator_firstза конечное (возможно нулевое) число шагов. В случае если последовательность является недопустимой, поведение программы не определено.
vector<int> vec1(10); // вектор из 10 элементов
vector<int> vec2(100); // вектор из 10 элементов
// [ vec1.begin()+5; vec1.begin() ) – недопустимая последовательность,
// несмотря на то, что по отдельности итераторы действительны
// vec1.begin() недостижим из vec1.begin() + 5
copy(vec1.begin()+5, vec1.begin(),vec2.begin());
// [ vec1.begin()+50; vec1.end() ) – недопустимая последовательность,
// vec1.begin()+50 – недействительный итератор
copy(vec1.begin()+50, vec1.end(),vec2.begin());
// [ vec1.begin(); vec2.end() ) – недопустимая последовательность,
// итераторы принадлежат разным контейнерам
copy(vec1.begin(), vec2.end(), vec2.begin());
Некоторые алгоритмы1, принимают в качестве входных данных две последовательности. Первая последовательность задана, как обычно, парой итераторов [first1;last1), а вторая толькоfirst2 - итератором, указывающим на начало последовательности. В этом случае обычно предполагается, что длинна второй последовательности по крайне мере не меньше длинны первой последовательности, т.е. итератор применение к итераторуfirst2 операцииoperator++ (last1 –first1) раз не должно приводить к тому, что результирующий итератор станет недействительным.
Некоторый алгоритмы выводят результаты своей работу в отдельную последовательность (например copy), заданную итераторомresult, указывающим на начало последовательности. В этом случае также необходимо, чтобы последовательность имела длину достаточную, чтобы вместить результаты работы алгоритма. Однако в этом случаем, если итераторresultотносится в категории итераторов вывода, может быть применен back_insert_iterator,front_insert_iteratorилиinsert_itertor.