- •Определение класса
- •Пример (точка)
- •Оператор вывода (пример)
- •Параметр шаблона по умолчанию (пример)
- •Где перехватывать исключения?
- •Гарантии безопасности исключений
- •Базовые операции
- •Виртуальная функция
- •Использование virtual
- •Массив, как диапазон
- •Контейнер
- •Свойства элемента контейнера
- •Заголовочные файлы
- •Доступ к элементам list
- •Размеры list
- •Доступ к элементам map
- •Очередь с приоритетом
- •Дэк (двусвязная очередь)
- •Матрица (в математике)
- •Атд “матрица”
- •Дерево (доп. Определения)
- •Узел дерева (доп. Определения)
- •“Родственные отношения”
- •“Родственные отношения” (иллюстрация)
- •Баланс в дереве (иллюстрация)
- •Std::less (пример функтора)
- •Std::find_if (пример алгоритма)
- •Функциональные адаптеры
- •Производящая функция
- •Производящие функции для функциональных адаптеров
Std::less (пример функтора)
template<class T> struct less
: binary_function<T, T, bool>
{
bool operator()(const T& x,
const T& y) const
{
return x < y;
}
};
28.04.2012
cppNewb.ru 53
Std::find_if (пример алгоритма)
template<class InputIt,
class |
Predicate> |
|
InputIt |
find_if(InputIt |
first, |
InputIt last, Predicate pred)
{
for(; first != last; ++first) if (pred(*first))
break; return first;
}
28.04.2012
cppNewb.ru 54
Функциональные адаптеры
указатель на функцию -> функтор
pointer_to_binary_function, …
связывание аргумента
binder1st, binder2nd
метод -> функтор
mem_fun_t, …
отрицание функтора
unary_negate, binary_negate
28.04.2012
cppNewb.ru 55
stl::bind1st
template<class Op> class bind1st
: public unary_function<
typename Op::second_argument_type, typename Op::result_type>
{ protected:
Op op;
typename Op::first_argument_type value;
...
28.04.2012
cppNewb.ru 56
...
public:
stl::bind1st
bind1st(const Op& x,
const typename Op::first_argument_type& y)
: op(x), value(y)
{}
typename Op::result_type operator()(
const typename Op::second_argument_type& x) const
{
return op(value,x);
}
};
28.04.2012
cppNewb.ru 57
std::pointer_to_unary_function
template<class Arg, class Res> class pointer_to_unary_function
: public unary_function<Arg, Res>
{ protected:
Res(*pfunc)(Arg); public:
explicit pointer_to_unary_function(Res(*f)(Arg))
: pfunc (f) {}
Res operator()(Arg x) const { return pfunc(x); }
};
28.04.2012
cppNewb.ru 58
Производящая функция
создание объекта заданного типа
в шаблонном варианте автоматически выводит тип объекта по типам аргументов
28.04.2012
cppNewb.ru 59
Производящие функции для функциональных адаптеров
указатель на функцию -> функтор
ptr_fun
связывание аргумента
bind1st, bind2nd
метод -> функтор
mem_fun, mem_fun_ref
отрицание функтора
not1, not2
28.04.2012
cppNewb.ru 60
std::ptr_fun
(пример производящей функции)
template<class Arg, class Res> pointer_to_unary_function<Arg, Res> ptr_fun(Res (*f)(Arg))
{
return pointer_to_unary_function
<Arg, Res>(f);
}
28.04.2012
cppNewb.ru 61
Стандартные алгоритмы
информация о последовательности
поиск
модификация, в т.ч.
слияние
удаление
сортировка
перестановка
28.04.2012
cppNewb.ru 62
Стандартные алгоритмы
(для сортированных диапазонов)
поиск (бинарный)
слияние
теоретико-множественные
проверка вхождения
объединение
пересечений
разница
симметрическая разница
28.04.2012
cppNewb.ru 63
Поиск
It find(It first,It last, const T& val);
It find_if(It first,It last, UnF pred);
28.04.2012
cppNewb.ru 64
Поиск (бинарный)
bool binary_search(
It first,It last, const T& val [, Compare comp]);
It lower_bound(
It first,It last, const T& val [, Compare comp]);
It upper_bound(
It first,It last, const T& val [, Compare comp]);
28.04.2012
cppNewb.ru 65
Информация о диапазонах
count
подсчет элементов
count_if
подсчет элементов с предикатом
equal
сравнение диапазонов
lexicographical_compare
лексикографическое сравнение диапазонов
28.04.2012
cppNewb.ru 66
Модификация диапазонов
for_each
transform
fill
generate
swap
equal
rotate
random_shaffle
remove (_if)
copy (_if)
replace
insert
partition
unique
28.04.2012
cppNewb.ru 67
std::for_each
(вызов функции для элементов)
template<class InpIt, class Func> Function for_each(InpIt first,
InpIt last, Func f)
{
for ( ; first!=last; ++first) f(*first);
return f;
}
28.04.2012
cppNewb.ru 68
std::copy
(копирование диапазона)
template<class InpIt, class OutIt> OutIt copy(InpIt first, InpItlast,
OutIt result )
{
while (first != last)
*result++ = *first++; return result;
}
28.04.2012
cppNewb.ru 69
Копирование диапазона в поток
копирование диапазона может использоваться для ввода/вывода
пример:
ostream_iterator<int> out_it (cout, ", ");
copy(vec.begin(), vec.end(), out_it);
28.04.2012
cppNewb.ru 70
Адаптирующие итераторы
insert_iterator
back_insert_iterator
front_insert_itarator
28.04.2012
cppNewb.ru 71
std::back_insert (адаптирующий итератора)
вставка элементов в конец контейнера для алгоритмов переписывающих значения (например, copy)
контейнер должен обеспечивать
push_back
вызов operator= приводит к вставке,
остальные операции ничего не меняют
28.04.2012
cppNewb.ru 72
std::back_inserter (производящая функция)
template <class Cont> back_insert_iterator<Cont> back_inserter(Cont& x)
28.04.2012
cppNewb.ru 73
Конструирование алгоритмов
как «склеить» две последовательности?
скопировать одну в конец второй
пример:
list<int>::iterator it(firList.begin()); advance (it, 3); insert_iterator<list<int> >
insertIt(firList, it); copy(secList.begin(),secList.end(),
insertIt);
28.04.2012
cppNewb.ru 74
Операции над итераторами
advance
смещение итератора
difference
расстояние между итераторами
28.04.2012
cppNewb.ru 75
Рекомендации
избегайте повторного написания алгоритмов
конструируйте алгоритмы
помните о копировании объектов
читайте книги и практикуйте 8)
28.04.2012
cppNewb.ru 76
А где в stl стек или очередь?
адаптер
класс преобразующий интерфейс объекта к нужному интерфейсу
в stl – шаблонный класс
адаптеры контейнеров
std::stack std::queue std::prioriy_queue
28.04.2012
cppNewb.ru 77
std::stack (адаптер)
template<class T,
class Cont = deque<T> > class stack;
bool empty() const size_t size() const
value_type& top() // const
void push(const T&) void pop()
28.04.2012
cppNewb.ru 78
std::queue (адаптер)
template<class T,
class Cont = deque<T> > class queue;
bool empty() const size_t size() const
value_type& front() value_type& back() const
void push(const T&) void pop()
28.04.2012
cppNewb.ru 79
std::priority_queue (адаптер)
class
Cont
=
class >
Cmp =
less<typename Cont::value_type>
class priority_queue;
bool empty() const size_t size() const
value_type& top() // const
void push(const T&) void pop()
28.04.2012
cppNewb.ru 80