- •Тема 1: Динамическая память и интеллектуальные указатели
- •1. Особенности использования динамической памяти (распределяемая память, heap, freestore), стека. Примеры использования.
- •2. Особенности выделения и освобождения памяти для автоматических глобальных и локальных объектов, статических глобальных и локальных объектов. Примеры использования.
- •3. Операторы new и delete при работе с динамической памятью. Свойства указателей, передаваемых оператору delete. Примеры использования.
- •4. Утечка памяти (memory leak). Потерянный указатель (dangling pointer, wild pointer). Примеры использования.
- •5. Проблемы, связанных с использованием операторов new и delete при управлении динамической памятью. Примеры использования.
- •6. Динамически создаваемые объекты (dynamically allocated objects). Интеллектуальные указатели (smart pointers): преимущества, недостатки, особенности использования, различия. Примеры использования.
- •8. Класс интеллектуального указателя shared_ptr. Методы класса указателя shared_ptr. Особенности и примеры использования.
- •9. Копирование и присваивание указателей shared_ptr. Примеры использования.
- •10. Создание и использование объектов интеллектуальных указателей. Примеры.
- •11. Функция make_shared(). Использование функции make_shared() для создания и инициализации объектов интеллектуальных указателей. Примеры использования.
- •12. Счетчик ссылок (reference count), счетчик слабых ссылок (weak count), функция-удалитель (deleter), выделитель памяти (allocator). Примеры использования.
- •13. Использование ключевого слова auto. Примеры использования.
- •14. Классы, ресурсы которых имеют динамическую продолжительность существования. Случаи их использования. Совместное использование данных двумя объектами. Примеры использования.
- •15. Использование оператора new для динамического резервирования памяти и инициализации объектов. Примеры использования.
- •17. Особенности создание пользовательского класса умного указателя (smart pointer). Перечень необходимых условий для реализации пользовательского класса умного указателя. Пример использования.
- •18. Особенности копирования, присваивания и удаления объектов при создании пользовательского класса умного указателя (smart pointer). Пример использования.
- •19. Размещающий оператор new (placement new). Передача ему объекта nothrow. Пример использования.
- •20. Особенности исчерпания памяти. Исключения, возникающие при исчерпании памяти. Пример использования.
- •21. Время жизни динамически создаваемых объектов. Примеры использования.
- •22. Присваивание указателю значения nullptr. Примеры использования.
- •23. Использование указателя shared_ptr совместно с оператором new. Примеры использования.
- •24. Особенности совместного использования обычных указателей и интеллектуальных. Примеры использования.
- •30. Передача в функцию и возврат из функции указателя типа unique_ptr. Примеры использования.
- •31. Использование класса auto_ptr. Особенности и пример использования.
- •32. Передача функции удаления указателю unique_ptr. Примеры использования.
- •33. Класс интеллектуального указателя weak_ptr. Методы класса указателя weak_ptr. Особенности и пример использования.
- •34. Динамические массивы. Особенности работы с динамическими массивами. Особенности резервирования памяти для массивов. Динамическое резервирование пустого массива. Примеры использования
- •35. Оператор new и динамические массивы. Класс bad_array_new_length. Примеры использования.
- •36. Инициализация массива динамически созданных объектов встроенных и пользовательских типов. Примеры использования.
- •37. Особенности освобождение памяти, выделенной для динамических массивов. Примеры использования.
- •38. Взаимодействие интеллектуальных указателей (класс unique_ptr) и динамических массивов. Примеры использования.
- •39. Класс Allocator и специальные алгоритмы. Примеры использования.
- •40. Алгоритмы копирования и заполнения неинициализированной памяти. Примеры использования
- •1. Особенности обработки исключительных ситуаций с использованием функции abort() и exit(). Преимущества и недостатки. Примеры использования.
- •2. Особенности обработки исключительных ситуаций с помощью возврата кода ошибки. Преимущества и недостатки. Примеры использования.
- •4. Роль типа исключения в его обработке. Охранный блок, блок перехвата. Использование механизма обработки исключений. Примеры использования.
- •5. Использование объектов классов в качестве исключений. Одинаковые свойства и различия операторов throw и return. Примеры использования.
- •7. Алгоритм раскручивания стека. Раскручивание стека при нормальном и аварийном завершении программы. Пример использования.
- •8. Понятие абсолютного обработчика, его синтаксис, особенности использования. Пример использования.
- •9. Класс exception. Методы класса exception. Использование наследования класса exception. Пример использования.
- •11. Исключение bad_alloc и операция new. Примеры использования. Использование нулевого указателя и операции new. Примеры использования.
- •12. Использование исключений вместе с классами и наследованием. Особенности использования вложенных классов.
- •13. Потеря исключений. Неперехваченное исключение. Использование функций terminate() и set_terminate().
- •14. Непредвиденное исключение. Использование функций unexpected() и set_unexpected(). Исключение типа std::bad_exception.
- •15. Предостережения относительно использования исключений. Использование и управление исключениями в современных языках программирования.
- •4. Изменение основания системы счисления, используемого для отображения данных. Набор констант типа fmtflags (константы форматирования), решаемые ими задачи.
- •7. Istream как псевдоним шаблона класса basic_istream. Взаимосвязь основных классов ввода/вывода. Ввод данных с помощью объекта cin
- •Istream и ostream как специализации для специализаций char. Wistream и wostream как специализации для типа wchar_t.
- •10. Класс basic_iostream. Iostream как псевдоним шаблона класса basic_iostream. Взаимосвязь основных классов ввода/вывода
- •12. Объекты wcout, wcin, wclog, wcerr, cout, cin, clog, cerr. Особенности их создания и использования.
- •14. Заголовочный файл iomanip. Функции setprecision(), setfill(), setw(). Использование манипуляторов из файла iomanip.
- •Тема 4: Файловый ввод-вывод
- •Понятие файла. Бинарные и текстовые файлы. Преимущества, недостатки, особенности использования.
- •Аргументы командной строки (argc, argv). Обработка данных командной строки. Примеры их использования.
- •Проверка состояния файлового потока. Метод is_open(). Особенности открытия нескольких файлов. Пример их использования.
- •Константы типа seekdir: ios_base::beg, ios_base::cur, ios_base::end. Примеры их использования.
- •Особенности работы с временными файлами. Функция tmpnam_s(). Пример её использования.
- •Класс string. Внутреннее форматирование с использованием классов ostringstream, istringstream. Примеры их использования.
- •Тема 5: Стандартная библиотека шаблонов stl.
- •1. Базовые принципы библиотеки шаблонов stl. Использование библиотеки stl. Заголовочные файлы complex, random.
- •4. Иерархия и концепция итераторов. Необходимость использования каждого типа итераторов. Указатель как итератор. Применение алгоритмов stl к контейнерам, не относящимся к библиотеке stl.
- •5. Входные, выходные, однонаправленные, двунаправленные итераторы, итераторы произвольного доступа: понятие, требования, особенности использования, направленность.
- •6. Шаблонный класс vector, deque, stack. Особенности, методы, принципы работы, возможности
- •7. Шаблонный класс array, valarray. Особенности, методы, принципы работы, возможности
- •8. Шаблонный класс list, forward_list. Особенности, методы, принципы работы, возможности
- •9. Шаблонный класс queue, priority_queue. Особенности, методы, принципы работы, возможности
- •10. Шаблонные классы set и multiset. Особенности, методы, принципы работы, возможности
- •11. Шаблонные классы map и multimap. Особенности, методы, принципы работы, возможности
- •12. Понятие функциональных объектов (функторов). Концепции функторов: генератор, унарная функция, бинарная функция, предикат, бинарный предикат. Предопределенные функторы
- •14. Группы алгоритмов. Алгоритмы «по месту», копирующие алгоритмы. Сравнение функций stl и методов контейнеров stl
- •15. Математические операции и их эквиваленты-функторы. Понятие полного упорядочения и квазиупорядочения
- •17. Понятие обобщенного программирования. Связь обобщенного программирования и библиотеки stl.
- •18. Использование алгоритма copy(), классов ostream_iterator и istream_iterator в качестве моделей входных и входных итераторов
- •19. Итераторы специального назначения: reverse_iterator, back_insert_iterator, front_insert_iterator, insert_iterator
- •Тема 6: Обзор Java. Введение в ооп в Java.
- •2. Обзор и отличительные особенности языка Java. Программная платформа и виртуальная машина Java. Особенности разработки и исполнения объектно-ориентированных приложений на Java.
- •3. Сборка мусора в Java. Пакет jdk: особенности, содержимое, необходимость использования, версии. Ide для работы на Java.
- •4. Особенности настройки работы платформы Java и запуск приложения на языке Java без ide.
- •5. Особенности лексики Java: литералы, идентификаторы, разделители, комментарии, ключевые слова.
- •6. Примитивные типы данных Java. Типизация. Целые числа (byte, short, int, long), числа с плавающей точкой (float, double), символы.
- •7. Переменные. Объявление переменной. Преобразование и приведение типов. Автоматическое приведение и продвижение типов в выражениях. Логические выражения. Область и срок действия переменной.
- •8. Операции (арифметические, поразрядные, отношения, логические (укороченные, обычные)). Операция присваивания. Предшествование операций.
- •9. Управляющие операторы (выбора, цикла, перехода). Разновидность цикла for в стиле for each. Комментарии в Java. Оператор instanceof.
- •Принципы объектно-ориентированного программирования в Java.
9. Шаблонный класс queue, priority_queue. Особенности, методы, принципы работы, возможности
Класс шаблона queue (объявленный в заголовочном файле queue) представляет собой класс адаптера. Класс queue накладывает больше ограничений, чем deque. Он не позволяет произвольный доступ к элементам очереди, он не разрешает выполнять итерацию по элементам очереди. Взамен queue ограничивается базовыми операциями, определяющими очередь. Можно добавлять элемент в конец очереди, удалять элемент из ее начала, просматривать значения первого и последнего элементов, проверять количество элементов, а также проверять, не пуста ли очередь.
Эти операции перечислены в таблице ниже.
Следует отметить, что pop() — это метод удаления данных, а не их извлечения. Если требуется использовать значение из очереди, то сначала нужно вызвать метод front() для извлечения значения, а затем pop() — для удаления его из очереди.
Таблица – Операции класса queue
Метод |
Описание |
bool empty() const |
Проверяет, пуста ли очередь |
size_type size() const |
Возвращает количество элементов в очереди |
reference front(); const_reference front() const; |
Возвращает ссылку на первый элемент в начале очереди |
reference back(); const_reference back() const; |
Возвращает ссылку на последний и самый последний добавленный элемент в конце очереди |
void push(const Type& val); |
Добавляет элемент в конец очереди |
void pop(); |
Удаляет элемент из начала части очереди |
Класс priority_queue (объявленный в заголовочном файле queue) представляет собой класс адаптера, который поддерживает те же операции, что и queue.
Главное отличие между priority_queue и queue состоит в том, что в priority_queue наибольшее значение перемещается в начало очереди. Внутреннее различие в том, что по умолчанию классом, лежащим в основе priority_queue, является vector. Операцию сравнения, используемую для определения того, что должно находиться в голове очереди, можно изменить, передавая необязательный аргумент конструктору:
priority_queue<int> pql;//версия по умолчанию
priority_queue<int> pq2(greater<int>);//использование greater<int> для упорядочения
Функция greater<>() — это предопределенный функциональный объект.
10. Шаблонные классы set и multiset. Особенности, методы, принципы работы, возможности
Простейшим ассоциативным контейнером из четырех является set (множество, набор). Тип его значения совпадает с типом ключа, а ключи уникальны — т.е. в наборе хранится не более одного экземпляра каждого значения ключа.
Действительно, для set значение элемента является также его ключом. Тип multiset подобен set, за исключением того, что он может содержать более одного значения с одним и тем же ключом. Например, если типом ключа и значения является int, то объект multiset может содержать значения 1, 2, 2, 2, 3, 5, 7 и 7.
В случае map тип значения отличается от типа ключа, причем ключи уникальны и на каждый ключ приходится только одно значение. Тип multimap подобен map, за исключением того, что один ключ может быть связан с несколькими значениями. КЛАСС SET
Класс set из STL моделирует несколько концепций.
Это ассоциативный, обратимый и отсортированный набор с уникальными ключами, поэтому он не может содержать более одного заданного значения.
Подобно vector и list, set использует параметр шаблона для указания хранимого типа:
set<string> A;//набор строковых объектов
Необязательный второй аргумент шаблона может служить для указания функции сравнения или объекта, который должен использоваться для упорядочивания ключей. По умолчанию применяется шаблон less<>. Старые реализации C++ могут не предоставлять значений по умолчанию, а потому требуют явного указания второго параметра шаблона:
set<string, less<string>> A;//старая реализация
Как и другие контейнеры, контейнер set имеет конструктор, который принимает в качестве аргументов диапазон итераторов. Это обеспечивает простой способ инициализации набора содержимым массива.
В математике определены стандартные операции для наборов (множеств). Например, объединение двух наборов — это набор, состоящий из содержимого этих двух наборов. Если определенное значение — общее для двух наборов, то вследствие уникальности ключей оно появляется в их объединении только один раз. Пересечение двух наборов — это набор, состоящий из элементов, общих для обоих этих наборов. Разность двух наборов — это первый набор за вычетом элементов, общих для обоих.
Библиотека STL предоставляет алгоритмы, которые поддерживают эти операции. Они представляют собой общие функции, а не методы, поэтому не ограничены объектами set. Однако все объекты set автоматически удовлетворяют обязательному условию применения этих алгоритмов — а именно тому, что контейнер должен быть отсортирован.
Функция set_union() объединяет все элементы, принадлежащие по меньшей мере одному из двух отсортированных диапазонов источников, в один сортированный диапазон назначения, где критерий упорядочения может быть задан двоичным предикатом. Функция set_union() принимает пять итераторов в качестве аргументов. Первые два определяют диапазон одного набора, вторые два — диапазон второго набора, а последний — это выходной итератор, указывающий местоположение, куда следует копировать результирующий набор. Например, для вывода объединения наборов А и В можно воспользоваться показанным ниже оператором:
set_union(A.begin(), A.end(), B.begin(), B.end(),
ostream_iterator<string, char> (cout, " "));
Функции set_intersection() и set_difference() находят пересечение и разность двух наборов и обладают тем же интерфейсом, что и set_union().
Метод lower_boind() принимает значение типа ключа в качестве аргумента и возвращает итератор, указывающий на первый элемент набора, который не меньше ключевого аргумента.
Метод upper_bound() принимает ключ в качестве аргумента и возвращает итератор, указывающий на первый элемент набора, который больше ключевого аргумента. Например, если имеется набор строк, эти методы можно применять для определения диапазона, включающего все строки в наборе от "b" до "f".
Поскольку сортировка определяет, куда будут помещаться добавления к набору, класс имеет методы, которые лишь указывают добавляемые данные без указания позиции. Например, если А и В — наборы строк, то можно использовать следующий код:
Класс multimap — это обратимый, отсортированный ассоциативный контейнер.
Однако при использовании multimap тип ключа отличается от типа значения, а объект multimap может содержать более одного значения, связанного с конкретным ключом.
Простейшее объявление multimap задает тип ключа и тип значения, сохраненные в виде аргументов шаблона. Например, следующее объявление создает объект multimap, который использует int как тип ключа и string — в качестве типа сохраненного значения:
multimap<int, string> codes;
Необязательный третий аргумент шаблона может применяться для указания функции сравнения или объекта, который будет использоваться для упорядочивания ключа. По умолчанию применяется шаблон less<> с типом ключа в качестве параметра.
Короче говоря, действительный тип значения объединяет тип ключа и тип данных в единую пару. Для этого STL использует класс шаблона pair<class T, class U> для хранения двух видов значений в одном объекте. Если keytype — тип ключа, а datatype — тип сохраненных данных, то типом значения будет pair<const keytype, datatype>. Например, типом значения ранее объявленного объекта codes является pair<const int, string>.
Предположим, что требуется хранить названия городов с кодом региона в качестве ключа. Это вполне соответствует объявлению объекта codes, которое использует int как тип ключа и string — как тип данных. Один из возможных подходов — создание пары и вставка ее в объект multimap:
multimap<int, string> codes;
pair<const int, string> item(213, "Los Angeles"); codes.insert(item);
Либо можно создать анонимный объект pair и вставить его в единственном операторе:
multimap<int, string> codes;
codes.insert(pair<const int, string>(213, "Los Angeles"));
Поскольку элементы сортируются по ключу, то нет необходимости указывать позицию вставки.
Располагая объектом pair, получать доступ к двум его компонентам можно с помощью элементов first и second:
pair<const int, string> item(213, "Los Angeles"); cout <<item.first <<' ' <<item.second <<endl;
Метод-элемент count() принимает в качестве аргумента ключ и возвращает количество элементов, имеющих такое значение ключа.
Методы-элементы lower_bound() и upper_bound() принимают ключ и работают так же, как в классе set.
Метод-элемент equal_range() принимает в качестве аргумента ключ и возвращает итераторы, представляющие диапазон значений, соответствующих этому ключу. Чтобы вернуть два значения, метод упаковывает их в один объект pair, на этот раз с обоими аргументами шаблона — итераторами.