
- •Тема 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.
Тема 5: Стандартная библиотека шаблонов stl.
1. Базовые принципы библиотеки шаблонов stl. Использование библиотеки stl. Заголовочные файлы complex, random.
Библиотека STL — набор шаблонных классов и функций общего
назначения. Ядро стандартной библиотеки шаблонов включает три основных
элемента: контейнеры, алгоритмы, итераторы. Они работают совместно друг
с другом, предоставляя тем самым готовые решения для различных задач
программирования.
+ здесь можно говорить о чем угодно из всех вопросов этой теме (особенно вопросы 2, 3, 13)
Standard library header <complex>
Standard library header <random>
используется для генерации псевдослучайных чисел
*и еще куча всякой такой непонятной всячины*
2. Понятие контейнера. Контейнеры-последовательности. Ассоциативные контейнеры. Виды контейнеров. Концепции контейнеров. Свойства базовых контейнеров. Виды сложностей выполнения операций: время компиляции, постоянная, линейная.
Контейнеры — это объекты, которые содержат в себе другие объекты.
Контейнеры можно разделить на три категории: последовательные
контейнеры (sequence containers), ассоциативные контейнеры (associative
containers) и адаптеры контейнеров.
Например, класс vector определяет динамический массив, класс queue
создает двустороннюю очередь, а класс list обеспечивает работу с линейным
списком. Эти контейнеры называются последовательными контейнерами и
являются базовыми в STL.
Помимо базовых, библиотека STL определяет ассоциативные
контейнеры, которые позволяют эффективно находить нужные значения на
основе ключей. Например, класс map обеспечивает хранение пар "ключ-
значение" и предоставляет возможность находить значение по заданному
уникальному ключу.
Каждый контейнерный класс определяет набор функций, которые
можно применять к данному контейнеру. Например, контейнер списка (list)
включает функции, предназначенные для выполнения вставки, удаления и
объединения элементов.
КОНЦЕПЦИИ КОНТЕЙНЕРОВ
Концепции элементарного контейнера не соответствует ни один тип, однако эта концепция описывает элементы, общие для всех контейнерных классов. Она представляет собой разновидность концептуального абстрактного класса — концептуального потому, что классы контейнеров на самом деле не используют механизм наследования. Или, если посмотреть на это иначе, концепция контейнера устанавливает набор требований, которым должны удовлетворять все классы контейнеров STL.
Контейнер — это объект, который хранит в себе другие объекты одного типа.
Хранимые объекты могут быть объектами в смысле объектноориентированного программирования либо значениями встроенных типов. Данные, сохраненные в контейнере, принадлежат контейнеру. Это означает, что, когда время существования контейнера истекает, истекает и время хранения данных контейнера. Однако если данные являются указателями, то истечение срока существования указываемых ими данных не обязательно.
В контейнере нельзя сохранять объекты какого угодно вида. В частности, тип хранимых объектов должен допускать присваивание и конструирование копированием. Базовые типы удовлетворяют этим требованиям, как и типы классов — если только определение класса не объявляет конструктор копирования и/или операцию присваивания закрытыми или защищенными. В С++11 эти концепции уточняются за счет добавления таких терминов, как допускающий вставку копированием (CopyInsertable) и допускающий вставку переносом (MoveInsertable), но мы ограничимся несколько упрощенным, хотя и менее точным описанием.
Базовый контейнер не гарантирует, что его элементы будут сохранены в каком-то определенном порядке или же, что этот порядок не изменится, но подобные гарантии могут быть получены за счет уточнений концепции. Все
контейнеры предоставляют определенные функциональные возможности и операции. Некоторые из этих общих функциональных возможностей кратко описаны в таблице ниже. В таблице посредством X представляется тип контейнера (такой, например, как vector), Т — тип объекта, хранящегося в контейнере, а и b — значения типа X, r — значение типа Х&, а u — идентификатор типа X (т.е. если X представляет vector<int>, то u — это объект vector<int>).
3. Понятие итератора. Виды итераторов. Предназначение итераторов. Связь итераторов и указателей. Особенности использования итераторов. Операции, которые необходимо реализовать для создания класса-итератора.
Итераторы действуют подобно указателям. Они позволяют
циклически опрашивать содержимое контейнера практически так же, как это
делается с помощью указателя при циклическом опросе элементов массива.
Итераторы обрабатываются аналогично указателям. Их можно
инкрементировать и декрементировать. К ним можно применять оператор
разыменования адреса *. Итераторы объявляются с помощью типа iterator,
определяемого различными контейнерами.
Библиотека STL поддерживает реверсивные итераторы, которые
являются либо двунаправленными, либо итераторами произвольного
доступа, позволяя перемещаться по последовательности в обратном
направлении. Следовательно, если реверсивный итератор указывает на конец
последовательности, то после инкрементирования он будет указывать на
элемент, расположенный перед концом последовательности.
При ссылке на различные типы итераторов в описаниях шаблонов в
библиотеке STL используются термины, описанные в таблице ниже.
Свой класс итератор
Итератор следует наследовать от класса std::iterator. Сам по себе этот класс не реализует никаких методов, но объявляет необходимые типы, которые используются в стандартных алгоритмах.
Это шаблонный класс, первый параметр шаблона — тип итератора, так как собираемся использовать со стандартной библиотекой, то тип выбирается из следующих типов: input_iterator_tag, output_iterator_tag, forward_iterator_tag, bidirectional_iterator_tag, random_access_iterator_tag. Второй параметр тип значения которое хранится и возвращается операторами * и ->, теретий параметр — тип который может описывать растояние между итераторами, четвртый шаблонный параметр — тип указателя на значение, пятый — тип ссылки на значения. Обязательными являются первые два параметра.
Самый просто итератор — это InputIterator (input_iterator_tag), он должен поддерживать префиксную форму инкремента, оператор !=, оператор* и оператор -> (его реализовывать не буду, так как в примере итератор используется для типа int, и в этом случае operator-> бессмысленен). Помимо этого понадобится конструктор и конструктор копирования. В примере не предполагается создание итератора кроме, как методами begin и end класса контейнера, поэтому конструктор итератора будет приватным, а класс контейнера объявлен как дружественный.
Итератор можно создать и использовать без контейнера, а иногда контейнер не нужен вовсе. Итераторы могут служить обертками над другими итераторами и модифицировать их поведение, например выдавать элементы через один. Или отдельно хранятся данные, а отдельно контейнер с некоторыми ключами или значениями полей. И можно организовать итератор, который будет проходится по всем желементам, но возвращать только те что соответвуют некотрому условию основанному на значениях второго контейнера.
* ресурс https://habr.com/ru/post/265491/