polevoy_cpp_2012_spring_lecture_12
.pdfПример (qsort)
//pData – массив структур SBook
//num – число элементов в массиве
int (*pCmp)(const void*, const void*)(cmpByYear);
qsort(pData, num, sizeof(*pData), pCmp);
28.04.2012 |
cppNewb.ru |
41 |
Пример (qsort)
int cmpByYear(const void* pL, const void* pR)
{
assert((0 != pL) && (0 != pR));
SBook& lhs(*reinterpret_cast<SBook*>(pL)); SBook& rhs(*reinterpret_cast<SBook*>(pR)); return (rhs.m_year - lhs.m_year);
}
28.04.2012 |
cppNewb.ru |
42 |
Проблемы call-back функций
•нет контроля типов
•накладные на вызовы функций
•глобальные данные
28.04.2012 |
cppNewb.ru |
43 |
Стандартные алгоритмы
•шаблонные функции, параметризуются через
–итераторы
–функторы
•если тип итераторов контейнера не соответствует типу итераторов алгоритма, поищите метод контейнера
28.04.2012 |
cppNewb.ru |
44 |
std::find (пример алгоритма)
template<class InputIt, class T> InputIt find(InputIt first,
InputIt last, const T& value)
{
for(;first != last; ++first) if (*first == value)
break; return first;
}
28.04.2012 |
cppNewb.ru |
45 |
std::sort (варианты функции)
• для контейнеров с произвольным доступом
template<class RandAccIt> void sort(RandAccIt first,
RandAccIt last)
template<class RandAccIt, class Compare>
void sort(RandAccIt first, RandAccIt last, Compare comp)
28.04.2012 |
cppNewb.ru |
46 |
std::sort (варианты функции)
• для списка
void list::sort()
template <class Compare>
void list::sort(Compare comp)
28.04.2012 |
cppNewb.ru |
47 |
Функтор (функциональный объект)
•экземпляр любого класса, перегружающего operator()
•используется для параметризации
алгоритмов
•может встраиваться компилятором в тело алгоритма (в отличии от обычной
функции)
28.04.2012 |
cppNewb.ru |
48 |
Функтор (функциональный объект)
•может содержать данные
•может копироваться в процессе работы
алгоритма
–для некоторых алгоритмов не должен иметь изменяемого состояния
28.04.2012 |
cppNewb.ru |
49 |
Свойства функторов
(traits)
•информация о типах аргументов и результата
•используются в шаблонном коде
28.04.2012 |
cppNewb.ru |
50 |