алгоритмы stl

11
АЛГОРИТМЫ STL Михаил Кройтор

Upload: mcroitor

Post on 18-Jul-2015

124 views

Category:

Education


6 download

TRANSCRIPT

Page 1: алгоритмы stl

АЛГОРИТМЫ STL

Михаил Кройтор

Page 2: алгоритмы stl

Содержание

Понятие алгоритма

предикаты

Имена алгоритмов в STL

Алгоритмы, не изменяющие последовательность

Алгоритмы, изменяющие последовательность

Page 3: алгоритмы stl

Понятие алгоритма

Алгоритм это …Конечная последовательность действий, приводящая к желаемому результату

Page 4: алгоритмы stl

Предикаты

Предикатом называется функция, возвращающая логическое значение

Алгоритмы STL оперируют унарными и бинарными предикатами.

Page 5: алгоритмы stl

Имена алгоритмов в STL

Для некоторых алгоритмов существуют как оперативные, так и копирующие версии. Для алгоритма <algorithm> копирующая версия называется <algorithm>_copy

Для некоторых алгоритмов существуют предикатные версии. Предикатная форма алгоритма <algorithm> называется <algorithm>_if

Если у алгоритма <algorithm> существует предикатная копирующая версия, она называется <algorithm>_copy_if

Page 6: алгоритмы stl

Легенда

T тип элемента, хранящегося в контейнере

IIter Input Iterator

OIter Output Iterator

FIter Forward Iterator

BIter Bidirectional Iterator

RAIter Random Access Iterator

Pred Функтор предикат

UPred Унарный предикат

BPred Бинарный предикат

Func Функтор Function

Page 7: алгоритмы stl

Алгоритмы, не изменяющие последовательность

Алгоритм описание

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.

Есть предикатная форма.

Page 8: алгоритмы stl

Алгоритмы, не изменяющие последовательность 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 – если не находит.Предикатная форма проверяет подинтервал на удовлетворение предикату.

Page 9: алгоритмы stl

Алгоритмы, изменяющие последовательность

Алгоритм описание

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 – меняет местами значения двух итераторов.

Page 10: алгоритмы stl

Алгоритмы, изменяющие последовательность 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.

Page 11: алгоритмы stl

Алгоритмы, изменяющие последовательность 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))