Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
Обобщенное программирование - это подход к программированию, когда алгоритм пишется без указания конкретных типов данных. Используя данный подход можно значительно увеличить количество повторно используемого кода. В C++ данный подход реализуется за счет механизма шаблонов. В данном докладе рассмотрим некоторые возможности по обобщенному программированию, которые предоставляет C++. На конкретных примерах рассмотрим, как они могут упростить нам жизнь и с какими трудностями приходится сталкиваться при их использовании.
Точечная оценка. Определение
Пример 1
Свойства точечных оценок
Несмещенность
Пример 2
Состоятельность
Эффективность
Асимптотическая нормальность
Робастность
Описательная статистика, цели. Вариационный ряд
Полигон частот
Гистограмма
Гистограмма, пример. Выбор числа интервалов
Выборочные характеристики
Характеристики положения и рассеяния
Выборочные характеристики двумерной выборки
Основные задачи математической статистики. Примеры задач
Выборка.Выборочное пространство. Примеры
Простой случайный выбор. Реальные виды выборов
Функция распределения выборки
Эмпирическая вероятностная мера
Теорема Гливенко-Кантелли
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицыDEVTYPE
Сколько есть способов разбить натуральное число в сумму нескольких слагаемых, если суммы, отличающиеся только порядком слагаемых, считаются одинаковыми? Оказывается, что на этот, казалось бы, элементарный вопрос нет простого ответа. Зато теория, начинающаяся с этого вопроса, оказывается очень интересной, а ее результаты находят применение в самых разных разделах математики и математической физики.
Настоящая брошюра написана по материалам лекций, прочитанных автором на летней школе «Современная математика» в Дубне в июле 2013 года. Она рассчитана на старшеклассников и студентов младших курсов.
Опечатки в слайдах на видео: в псевдокоде алгоритма решения непрерывной задачи о рюкзаке предметы должны сортироваться по убыванию (а не возрастанию) удельной стоимости.
- Определение чисел Фибоначчи, скорость роста
- Общая формула, экспоненциальная скорость роста
- Наивный алгоритм и анализ его времени работы
- Более быстрый алгоритм и анализ его времени работы, заключение
- Более детальный анализ алгоритма вычисления чисел Фибоначчи
- Определения O(⋅), преимущества и недостатки их использования для оценки времени работы алгоритмов
- Определения Ω(⋅),Θ(⋅),o(⋅), общие правила сравнения скорости роста стандартных функций
- Графики нескольких часто используемых функций
- Скорости часто используемых функций на практике, заключение
2. Модификаторы доступа
Модификаторы доступа позволяют ограничивать доступ к
методам и полям класса.
struct IntArray {
explicit IntArray(size_t size)
: size_(size), data_(new int[size ])
{}
~IntArray () { delete [] data_; }
int & get(size_t i) { return data_[i]; }
size_t size () { return size_; }
private:
size_t size_;
int * data_;
};
2/7
3. Ключевое слово class
Ключевое слово struct можно заменить на class, тогда поля
и методы по умолчанию будут private.
class IntArray {
public:
explicit IntArray(size_t size)
: size_(size), data_(new int[size ])
{}
~IntArray () { delete [] data_; }
int & get(size_t i) { return data_[i]; }
size_t size () { return size_; }
private:
size_t size_;
int * data_;
};
3/7
4. Инварианты класса
∙ Выделение публичного интерфейса позволяет
поддерживать инварианты класса
(сохранять данные объекта в согласованном состоянии).
struct IntArray {
...
size_t size_;
int * data_; // массив размера size_
};
∙ Для сохранения инвариантов класса:
1. все поля должны быть закрытыми,
2. публичные методы должны сохранять инварианты класса.
∙ Закрытие полей класса позволяет абстрагироваться от
способа хранения данных объекта.
4/7
5. Публичный интерфейс
struct IntArray {
...
void resize(size_t nsize) {
int * ndata = new int[nsize ];
size_t n = nsize > size_ ? size_ : nsize;
for (size_t i = 0; i != n; ++i)
ndata[i] = data_[i];
delete [] data_;
data_ = ndata;
size_ = nsize;
}
private:
size_t size_;
int * data_;
};
5/7