
- •Тема 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.
7. Шаблонный класс array, valarray. Особенности, методы, принципы работы, возможности
Класс шаблона array определенный в заголовочном файле array, не является контейнером STL, поскольку имеет фиксированный размер. Поэтому операции, которые должны были бы изменять размер контейнера, такие как push_back() и insert(), для класса array не определены. Однако определены те функции-элементы, которые имеют для него смысл, например, operator[] и at(). Кроме того, с объектами массивов можно использовать многие стандартные алгоритмы STL, такие как сору() и for_each().
Аrray разработан в качестве замены встроенного типа массива, сочетая в себе компактность и эффективность типа с более удобным и безопасным интерфейсом. Имея фиксированный размер, array не поддерживает push_back() и insert(), но предоставляет ряд других методов STL. В их число входят begin(), end(), rbegin() и rend(), что упрощает применение алгоритмов STL к объектам array.
Класс шаблона valarray, поддерживаемый заголовочным файлом valarray. Этот класс шаблона спроектирован для представления числовых массивов и предоставляет поддержку множества операций с числовыми массивами, такие как добавление содержимого одного массива к другому, применение математических функций к каждому элементу массива и применение к массивам операций линейной алгебры.
Класс valarray перегружает обычные математически функции для принятия объекта valarray в качестве аргумента и возврата объекта valarray, поэтому можно использовать такой оператор:
vad3 = log(vad1);//операция log() перегружена
Или же можно воспользоваться методом apply(), который работает также для неперегруженных функций:
vad3 = vad1.apply(log);
Метод apply() не изменяет вызывающий объект; вместо этого он возвращает новый объект, содержащий результирующие значения.
Простота интерфейса valarray становится еще более очевидной при выполнении многошаговых вычислений:
vad3 = 10.0 * ((vad1 + vad2) / 2.0 + vad1 * cos(vad2));
Класс valarray также предлагает метод sum(), который суммирует содержимое объекта valarray, метод size(), подсчитывающий количество элементов, метод max(), который возвращает наибольшее значение объекта, и метод min(), возвращающий наименьшее значение.
Класс valarray имеет метод resize(), но не осуществляет автоматического изменения размера, подобного тому, которое обеспечивает метод pushback() класса vector. He существует никаких методов для вставки значений, выполнения поиска, сортировки и тому подобных действий. Короче говоря, класс valarray более ограничен, чем класс vector, но его более узкое назначение позволяет иметь намного более простой интерфейс.
8. Шаблонный класс list, forward_list. Особенности, методы, принципы работы, возможности
Список — контейнер с двунаправленным последовательным доступом к элементам. Класс list поддерживает функционирование двунаправленного линейного списка. В отличие от вектора, в котором реализована поддержка произвольного доступа, список позволяет получать к своим элементам только последовательно.
Двунаправленность списка означает, что доступ к его элементам возможен в двух направлениях: от начала к концу и от конца к началу. Шаблонная спецификация класса list выглядит следующим образом.
template <class Type, class Allocator= allocator<Type>> class list
Здесь Type — тип данных, сохраняемых в списке, а элемент allocator означает распределитель памяти, который по умолчанию использует стандартный распределитель.
Таблица – Методы-элементы класса list
Метод |
Описание |
void assign |
Стирает элементы из списка и копирует новый набор элементов в целевой список. |
void assign initializer_list<Type> IList); template <class InputIterator> void assign(InputIterator First, InputIterator Last); |
|
reference back(); const_reference back() const; |
Возвращает ссылку на последний элемент списка |
const_iterator begin() const; iterator begin(); |
Возвращает итератор, адресующий первый элемент в списке |
void clear(); |
Удаляет все элементы списка |
bool empty() const; |
Проверяет, пуст ли список |
const_iterator end() const; iterator end(); |
Возвращает итератор, который обращается к местоположению, следующему за последним элементом в списке |
iterator erase(iterator Where); iterator erase(iterator first, iterator last); |
Удаляет элемент или диапазон элементов в списке из заданных позиций |
reference front(); const_reference front() const; |
Возвращает ссылку на первый элемент списка |
Allocator get_allocator() const; |
Возвращает копию объекта распределителя, используемого для построения списка |
iterator insert(iterator Where, const Type& Val); iterator insert(iterator Where, Type&& Val); void insert(iterator Where, size_type Count, const Type& Val); iterator insert(iterator Where, initializer_list<Type> IList); template <class InputIterator> void insert(iterator Where, InputIterator First, InputIterator Last); |
Вставляет элемент или ряд элементов или диапазон элементов в список в заданной позиции |
size_type max_size() const; |
Возвращает максимальную длину списка |
void pop_back(); |
Удаляет элемент в конце списка |
void pop_front(); |
Удаляет элемент в начале списка |
void push_back(void push_back(Type&& val); |
Добавляет элемент в конец списка |
void push_front(const Type& val); void push_front(Type&& val); |
Добавляет элемент в начало списка |
const_reverse_iterator rbegin() const; reverse_iterator rbegin(); |
Возвращает итератор, который обращается к первому элементу в перевернутом списке |
void remove(const Type& val); |
Стирает элементы в списке, соответствующие заданному значению |
template <class Predicate> void remove_if(Predicate pred) |
Стирает элементы из списка, для которых выполняется заданный предикат |
const_reverse_iterator rend() const; reverse_iterator rend(); |
Возвращает итератор, который обращается к местоположению, следующему за последним элементом в перевернутом списке |
void resize(size_type _Newsize); void resize(size_type _Newsize, Type val); |
Задает новый размер для списка |
void reverse(); |
Изменяет порядок расположения элементов в списке в обратном порядке |
size_type size() const; |
Возвращает количество элементов в списке |
void swap(list<Type, Allocator>& right); friend void swap(list<Type, Allocator>& left, |
Меняет местами элементы двух списков |
list<Type, Allocator>& right) |
|
void merge(list<Type, Allocator>& right); template <class Traits> void merge(list<Type, Allocator>& right, Traits comp); |
Удаляет элементы из списка аргументов, вставляет их в целевой список и упорядочивает новый комбинированный набор элементов в порядке возрастания или в каком-либо другом заданном порядке. |
void sort(); template <class Traits> void sort(Traits comp); |
Упорядочивает элементы списка в порядке возрастания или по отношению к какомулибо другому заданному пользователем порядку |
// insert the entire source list void splice(const_iterator Where, list<Type, Allocator>& Source); void splice(const_iterator Where, list<Type, Allocator>&& Source); // insert one element of the source list void splice(const_iterator Where, list<Type, Allocator>& Source, const_iterator Iter); void splice(const_iterator Where, list<Type, Allocator>&& Source, const_iterator Iter); // insert a range of elements from the source list void splice(const_iterator Where, list<Type, Allocator>& Source, const_iterator First, const_iterator Last); void splice(const_iterator Where, list<Type, Allocator>&& Source, const_iterator First, const_iterator Last); |
Удаляет элементы из исходного списка и вставляет их в список назначения |
void unique(); template <class BinaryPredicate> void unique(BinaryPredicate pred); |
Удаляет из списка соседние повторяющиеся элементы или соседние элементы, удовлетворяющие какому-либо другому двоичному предикату |
Чтобы достичь максимальной гибкости и переносимости для любого объекта, который подлежит хранению в списке, следует определить конструктор по умолчанию и оператор "<" (желательно определить и другие операторы сравнения). Более точные требования к объекту (как к потенциальному элементу списка) необходимо согласовывать в соответствии с документацией на используемый компилятор.
Один упорядоченный список можно объединить с другим. В результате получится упорядоченный список, который включает содержимое двух исходных списков. Новый список остается в вызывающем списке, а второй список становится пустым.
В С++11 появился новый класс контейнера forward_list (однонаправленный список). Этот класс реализует односвязный список. В таком списке каждый элемент связан только со следующим элементом, но не с предыдущим. Поэтому такой класс требует только однонаправленного, а не двунаправленного итератора.
template <class Type, class Allocator= allocator<Type>> class forward_list
Таким образом, в отличие от vector и list, forward_list не является обратимым контейнером. По сравнению с list, forward_list проще, компактнее, но предлагает меньше возможностей