алгоритмы stl
TRANSCRIPT
АЛГОРИТМЫ STL
Михаил Кройтор
Содержание
Понятие алгоритма
предикаты
Имена алгоритмов в STL
Алгоритмы, не изменяющие последовательность
Алгоритмы, изменяющие последовательность
Понятие алгоритма
Алгоритм это …Конечная последовательность действий, приводящая к желаемому результату
Предикаты
Предикатом называется функция, возвращающая логическое значение
Алгоритмы STL оперируют унарными и бинарными предикатами.
Имена алгоритмов в STL
Для некоторых алгоритмов существуют как оперативные, так и копирующие версии. Для алгоритма <algorithm> копирующая версия называется <algorithm>_copy
Для некоторых алгоритмов существуют предикатные версии. Предикатная форма алгоритма <algorithm> называется <algorithm>_if
Если у алгоритма <algorithm> существует предикатная копирующая версия, она называется <algorithm>_copy_if
Легенда
T тип элемента, хранящегося в контейнере
IIter Input Iterator
OIter Output Iterator
FIter Forward Iterator
BIter Bidirectional Iterator
RAIter Random Access Iterator
Pred Функтор предикат
UPred Унарный предикат
BPred Бинарный предикат
Func Функтор Function
Алгоритмы, не изменяющие последовательность
Алгоритм описание
template <class IIter, class Func>
Func for_each(IIter first, IIter last,
Func f);
Применяет к каждому значению интервала [first, last) функцию f.
template <class IIter, class T>
IIter find(IIter first, IIter last, const T&
val);
template <class IIter, class UPred>
IIter find_if(IIter first, IIter last, UPred
pred);
Возвращает первый итератор издиапазона [first, last), значение которого равно val (*i == val).
Предикативная форма возвращает первый итератор, соблюдающий условие pred(*i) == true
template <class IIter, class T>
typename
iterator_traits<IIter>::difference_type
count (IIter first, IIter last, const T&
val);
template <class IIter, class Pred>
typename
iterator_traits<IIter>::difference_type
count_if(IIter first, IIter last, UPred
Подсчитывает в диапазоне [first, last)
количество элементов, равных val.
Есть предикатная форма.
Алгоритмы, не изменяющие последовательность 2
Алгоритм Описание
template <class IIter1, class IIter2>
bool equal (IIter1 first1, IIter1 last1,
IIter2 first2);
template <class IIter1, class IIter2,
class BPred>
bool equal (IIter1 first1, IIter1 last1,
IIter2 first2, BPred pred);
Сравнивает интервалы [first1, last1) и [first2, first2 +(last1-first1)). В случаеравенства возвращает true.
Предикатная форма имеет то же имя и проверяет на выполнение условие pred(*i1, *i2) == true, где i1 из [first1,
last1) и i2 из [first2, first2 +(last1-first1)).
template <class FIter1, class FIter2>
FIter1 search(FIter1 first1, FIter1
last1,
FIter2 first2, FIter2 last2);
template <class FIter1, class FIter2,
class BPred>
FIter1 search(FIter1 first1, FIter1
last1,
FIter2 first2, FIter2 last2, BPred
pred);
Алгоритм ищет интервал [first2, last2) в интервале [first1, last1) и возвращает позицию первого элемента, если находит, last2 – если не находит.Предикатная форма проверяет подинтервал на удовлетворение предикату.
Алгоритмы, изменяющие последовательность
Алгоритм описание
template <class IIter, class OIter>
OIter copy(IIter first, IIter last, OIter
result);
template <class BIter1, class BIter2>
BIter2 copy_backward(BIter1 first,
BIter1 last, BIter2 result);
template <class IIter, class OIter, class
UPred>
OIter copy_if(IIter first, IIter last, OIter
result, UPred p);
Алгоритм, копирующий значения из полуинтервала [first, last) в [result,
result + (last-first)). copy_backwardкопирует элементы в обратном порядке. copy_if копирует элементы, удовлетворяющие условию p. Этот алгоритм был введен в стандарте С++11.
template <class T> void swap(T&
a,T& b);
template < class FIter1 , class FIter2>
FIter2 swap_ranges ( FIter1 first1,
FIter1 last1, FIter2 first2 );
template < class FIter1 , class FIter2>
void iter_swap ( FIter1 a , FIter2 b );
Алгоритм swap меняет значения двух переменных местами. swap_ranges –
меняет местами значения двух интервалов. iter_swap – меняет местами значения двух итераторов.
Алгоритмы, изменяющие последовательность 2
алгоритм описание
template < class FIter , class T>
void replace ( FIter first , FIter last ,
const T& old_value , const T&
new_value );
template < class FIter, class Pred,
class T>
void replace_if ( FIter first , FIter last ,
UPred pred , const T& new_value );
Заменяет old_value на new_value на отрезке [first, last). Предикативная форма заменяет все значения, удовлетворяющие предикату.
template <class FIter, class T>
FIter remove (FIter first, FIter last,
const T& val);
template <class IIter, class OIter,
class T> OIter remove_copy (IIter
first, IIter last, OIter result, const T&
val);
template <class FIter, class UPred>
FIter remove_if (FIter first, FIter last,
UPred pred);
Удаляет элементы из отрезка [first,
last), равные val.
Предикативная форма удаляет все элементы, удовлетворяющие условию pred.
Алгоритмы, изменяющие последовательность 3
алгоритм описание
template <class FIter>
FIter unique (FIter first, FIter last);
template <class FIter, class BPred>
FIter unique (FIter first, FIter last,
BPred pred);
Удаляет все повторы на отрезке [first,
last).
Предикатная форма сравнивает элементы из отрезка по функции сравнения pred
template <class FIter, class Generator>
void generate (FIter first, FIter last,
Generator gen);
Заполняет отрезок [first, last) значениями, возвращаемыми gen
template <class IIter, class OIter, class
UOper>
OIter transform (IIter first, IIter last,
OIter result, UOper op);
template <class IIter, class IIter, class
OIter, class BOper>
OIter transform (IIter first1, IIter1 last1,
IIter2 first2, OIter result, BOper
binary_op);
Первая версия записывает в выходной отрезок [result, result + (last-first))
значения op(*it) где it из отрезка [first,
last)
Вторая версия записывает в выходной отрезок [result, result + (last1-first1))
значения op(*it1, *it2) где it1 из отрезка [first1, last1), it2 из отрезка [first2,
first2+(last1-first1))