From ea0d9cde1176550542fc6046ca02acaa33d339ae Mon Sep 17 00:00:00 2001 From: Microvenator Date: Tue, 26 Nov 2024 12:13:31 +0300 Subject: [PATCH 01/36] C++ course contents draft --- cpp/contents.md | 304 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 304 insertions(+) create mode 100644 cpp/contents.md diff --git a/cpp/contents.md b/cpp/contents.md new file mode 100644 index 00000000..3498d921 --- /dev/null +++ b/cpp/contents.md @@ -0,0 +1,304 @@ +# Содержание курса по C++ + +В этом драфте мы устаканиваем содержание курса по C++. + +[] Что такое C++ +- Отличительные свойства +- Сильные и слабые стороны +- Области применения +- Мифы о C++ +- Инфраструктура вокруг языка - сборка, буст, тесты, пакетирование, статические анализаторы, линтеры, core guidelines, ... +- Кто и зачем развивает C++ - история, комитет, стандарт + +[] Базовые концепции +- Инструкции (statements), операторы (operators), выражения (expressions), точка с запятой +- Переменные, литералы, константы +- Объявления и определения +- Структура программы +- Области видимости +- Время жизни локальных переменных +- Точка входа main() + +[] Экскурсия по C++ +- Как выглядят условия, +- ...циклы, +- ...функции, +- ...классы, +- ...enum, +- ...нэймспэйсы, +- ...шаблоны +- ...макросы + +[*] Сборка проекта +- Организация проекта +- Что такое компиляция +- Компиляторы C++ +- Пайплайн компиляции + - Препроцессор + - Компилятор + - Ассемблер + - Линковщик +- C++ ABI +- Библиотеки + - Статические библиотеки + - Динамические библиотеки + - Header-only библиотеки +- Рантайм C++ +- Автоматизация сборки + - Make + - CMake + - Пакетные менеджеры + +[] Типы данных +- Классификация типов - что такое POD, фундаментальный тип, скалярный тип и тд +- Встроенные типы - int, char, ... и что с ними можно делать +- Модификаторы типов signed, unsigned, long и short +- Основные операторы: арифметические, логические, ... +- Вывод типов, auto +- Ссылки и указатели + +[] Операторы +- Присваивание +- Инкремент, декремент +- Арифметические операторы +- Логические операторы +- Порядок вычисления логических выражений +- Сравнение +- Другие операторы: member access, вызов функции, ... +- Приоритет операторов + +[] Условия +- if +- if с инициализатором +- Порядок вычисл +- тернарный оператор +- switch + +[] Циклы +- Варианты for +- while, do while +- continue, break +- goto + +[] Функции +- Способы передачи аргументов +- Значения аргументов по умолчанию +- Порядок вычисления аргументов функции +- Перегрузка функций +- inline + +[] Знакомство с stl +- Контейнеры. Классификация. Адаптеры для контейнеров +- Итераторы +- std::span +- Алгоритмы +- Кратко о том, что еще есть в stl: умные указатели и тд + +[] Строки +- std::string, +- std::string_view +- std::wstring + +[] Массивы +- std::vector +- std::array + +[] Списочные коллекции +- std::list +- std::forward_list +- std::deque, ... + +[] Ассоциативные контейнеры +- std::map +- std::unordered_map +- std::set +- std::unordered_set + +[] Алгоритмы +- Основные алгоритмы типа std::sort, std::find, ... + +[] Рейнджи +- Библиотека ranges: обзор +- Объединение операций через пайп +- Алгоритмы +- views +- Адаптеры + +--- +Майлстоун. Вы знаете базовый синтаксис и умеете работать с контейнерами. Можно решать задачи на лееткоде и хакерранке + +[] Перечисления +- enum +- enum class + +[] Обработка ошибок +- Исключения +- noexcept +- Ассерты +- Коды возврата +- std::optional + +[] Классы: основы +- Конструкторы, деструкторы, RAII +- Ключевое слово explicit +- protected, public, private, friends +- Отличие классов и структур +- this, static +- порядок создания и удаления членов данных (также про исключение про статик) +- const, mutable +- forward declaration + +[] Копирование и перемещение объектов +- Конструкторы и операторы копирования, перемещения +- Как надо писать конструкторы и операторы копирования, перемещения (сохранение предыдущего состояни при ошибке, пример реализации через swap()) +- Неявное преобразование и explicit +- Правило 3 (5) +- Спецификаторы =default, =delete +- Использование std::move(), std::forward() + +[] Обработка ошибок в классах +- Исключения в конструкторах +- Исключения в деструкторах, noexcept +- Как написать класс, соответствующий RAII без исключений + +Наследование и полиморфизм +- Наследование, переопределение методов +- Абстрактные классы, virtual, override, final +- Таблица виртуальных функций (для одиночного наследования) + +[] Множественное наследование +- Про множественное наследование. Ромбовидное наследование, проблемы +- Виртуальное наследование +- Таблица виртуальных функций (для множественного наследования) + +[] Перегрузка операторов +- Операторы сравнения +- Spaceship operator +- Операторы присваивания +- Реализация одних операторов через другие +- Унарные операции +- Инкремент, декремент +- Другие операторы: <<, ... + +[] Приведение типов +- Явное и неявное приведение +- c-style cast и его проблемы +- static_cast +- dynamic_cast +- const_cast +- reinterpret_cast + +--- +Майлстоун. Вы умеете строить абстракции. Можно заводить пет-проект + +[] Инициализация +- Варианты инициализации +- Most vexing parse +- Списки инициализации +- Агрегаты +- Designated initializers + +[] Пространства имен +- Что это, какие задачи решают +- using +- Вложенные пространства имен +- ADL + +[] Алиасы +- typedef, using + +[] Распаковка +- std::tie, std::pair +- Structured Binding + +[] Организация памяти +- Стэк, хип, статическая память +- volatile, static + +[] Указатели и ссылки +- Адресная арифметика +- Массивы +- Управление ресурсами +- Утечки памяти +- Необходимость в RAII и умных указателях + +[] Умные указатели +- unique +- shared +- weak + +[] Объединения +- Union'ы и почему их не надо использовать +- Альтернативы union'ам: std::variant + +--- +Майлстоун. Вы знаете, как устроены указатели. Можно начинать собеситься на простые вакансии + +[] I/O, Стримы +- Концепция стримов +- Читать/писать из файла + +[] Лямбда-функции +- Понятия callable object, functor, closure +- Синтаксис лямбды +- Как менялся синтаксис в разных стандартах +- Техники использования лямбд + +[] Компайл-тайм vs рантайм +- constexpr, consteval, constinit + +[] Шаблоны: основы +- синтаксис объявления шаблонов +- SFINAE +- перегрузка функций vs шаблонные функции + +[] Специализация шаблонов +- полная специализация шаблонов +- частичная специализация шаблонов (неплохо рассказать почему недоступна для функций) + +[] Вариадики +- Синтаксис вариадиков. Многоточие +- Пакет параметров (Parameter pack) +- sizeof...() +- выражения свертки (Fold expressions) + +[] Шаблоны на практике +- полезные варианты использования шаблонов: traits (типажи), стратегии +- механизм инстанцирования шаблонов и методы сокращения раздувание кода: локальные шаблоны, локальная инстанцирования шаблонов + +[] Конкурентность: обзор +- Потоки, thread_local +- Процессы +- Futures/promises +- Корутины +- Примитивы синхронизации +- Модель памяти + +[] Директивы препроцессора +- define +- ifdef +- ifndef, ... + +--- +Майлстоун. Вы познакомились с самыми важными аспектами C++. Можно разбираться в опенсорс проектах и не впадать в ступор + +[] Концепты + +[] Модули + +[] Undefined & unspecified behavior + +[] Интероп C++ и других языков + +[] Мой код не работает, и я не знаю, почему +- Отладка + - gdb +- Профилирование + - valgrind + - gperftools +- Поиск утечек + - AddressSanitizer + - memcheck + +--- +Майлстоун. Можно считать себя C++ разработчиком \ No newline at end of file From ef1e5af8750fda7ab9eba27d7437ead9f94e3f3c Mon Sep 17 00:00:00 2001 From: Microvenator Date: Tue, 26 Nov 2024 12:15:20 +0300 Subject: [PATCH 02/36] fix --- cpp/contents.md | 92 ++++++++++++++++++++++++------------------------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index 3498d921..5abb3f5e 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -2,7 +2,7 @@ В этом драфте мы устаканиваем содержание курса по C++. -[] Что такое C++ +# Что такое C++ - Отличительные свойства - Сильные и слабые стороны - Области применения @@ -10,7 +10,7 @@ - Инфраструктура вокруг языка - сборка, буст, тесты, пакетирование, статические анализаторы, линтеры, core guidelines, ... - Кто и зачем развивает C++ - история, комитет, стандарт -[] Базовые концепции +# Базовые концепции - Инструкции (statements), операторы (operators), выражения (expressions), точка с запятой - Переменные, литералы, константы - Объявления и определения @@ -19,7 +19,7 @@ - Время жизни локальных переменных - Точка входа main() -[] Экскурсия по C++ +# Экскурсия по C++ - Как выглядят условия, - ...циклы, - ...функции, @@ -29,7 +29,7 @@ - ...шаблоны - ...макросы -[*] Сборка проекта +# Сборка проекта - Организация проекта - Что такое компиляция - Компиляторы C++ @@ -49,7 +49,7 @@ - CMake - Пакетные менеджеры -[] Типы данных +# Типы данных - Классификация типов - что такое POD, фундаментальный тип, скалярный тип и тд - Встроенные типы - int, char, ... и что с ними можно делать - Модификаторы типов signed, unsigned, long и short @@ -57,7 +57,7 @@ - Вывод типов, auto - Ссылки и указатели -[] Операторы +# Операторы - Присваивание - Инкремент, декремент - Арифметические операторы @@ -67,57 +67,57 @@ - Другие операторы: member access, вызов функции, ... - Приоритет операторов -[] Условия +# Условия - if - if с инициализатором - Порядок вычисл - тернарный оператор - switch -[] Циклы +# Циклы - Варианты for - while, do while - continue, break - goto -[] Функции +# Функции - Способы передачи аргументов - Значения аргументов по умолчанию - Порядок вычисления аргументов функции - Перегрузка функций - inline -[] Знакомство с stl +# Знакомство с stl - Контейнеры. Классификация. Адаптеры для контейнеров - Итераторы - std::span - Алгоритмы - Кратко о том, что еще есть в stl: умные указатели и тд -[] Строки +# Строки - std::string, - std::string_view - std::wstring -[] Массивы +# Массивы - std::vector - std::array -[] Списочные коллекции +# Списочные коллекции - std::list - std::forward_list - std::deque, ... -[] Ассоциативные контейнеры +# Ассоциативные контейнеры - std::map - std::unordered_map - std::set - std::unordered_set -[] Алгоритмы +# Алгоритмы - Основные алгоритмы типа std::sort, std::find, ... -[] Рейнджи +# Рейнджи - Библиотека ranges: обзор - Объединение операций через пайп - Алгоритмы @@ -127,18 +127,18 @@ --- Майлстоун. Вы знаете базовый синтаксис и умеете работать с контейнерами. Можно решать задачи на лееткоде и хакерранке -[] Перечисления +# Перечисления - enum - enum class -[] Обработка ошибок +# Обработка ошибок - Исключения - noexcept - Ассерты - Коды возврата - std::optional -[] Классы: основы +# Классы: основы - Конструкторы, деструкторы, RAII - Ключевое слово explicit - protected, public, private, friends @@ -148,7 +148,7 @@ - const, mutable - forward declaration -[] Копирование и перемещение объектов +# Копирование и перемещение объектов - Конструкторы и операторы копирования, перемещения - Как надо писать конструкторы и операторы копирования, перемещения (сохранение предыдущего состояни при ошибке, пример реализации через swap()) - Неявное преобразование и explicit @@ -156,7 +156,7 @@ - Спецификаторы =default, =delete - Использование std::move(), std::forward() -[] Обработка ошибок в классах +# Обработка ошибок в классах - Исключения в конструкторах - Исключения в деструкторах, noexcept - Как написать класс, соответствующий RAII без исключений @@ -166,12 +166,12 @@ - Абстрактные классы, virtual, override, final - Таблица виртуальных функций (для одиночного наследования) -[] Множественное наследование +# Множественное наследование - Про множественное наследование. Ромбовидное наследование, проблемы - Виртуальное наследование - Таблица виртуальных функций (для множественного наследования) -[] Перегрузка операторов +# Перегрузка операторов - Операторы сравнения - Spaceship operator - Операторы присваивания @@ -180,7 +180,7 @@ - Инкремент, декремент - Другие операторы: <<, ... -[] Приведение типов +# Приведение типов - Явное и неявное приведение - c-style cast и его проблемы - static_cast @@ -191,82 +191,82 @@ --- Майлстоун. Вы умеете строить абстракции. Можно заводить пет-проект -[] Инициализация +# Инициализация - Варианты инициализации - Most vexing parse - Списки инициализации - Агрегаты - Designated initializers -[] Пространства имен +# Пространства имен - Что это, какие задачи решают - using - Вложенные пространства имен - ADL -[] Алиасы +# Алиасы - typedef, using -[] Распаковка +# Распаковка - std::tie, std::pair - Structured Binding -[] Организация памяти +# Организация памяти - Стэк, хип, статическая память - volatile, static -[] Указатели и ссылки +# Указатели и ссылки - Адресная арифметика - Массивы - Управление ресурсами - Утечки памяти - Необходимость в RAII и умных указателях -[] Умные указатели +# Умные указатели - unique - shared - weak -[] Объединения +# Объединения - Union'ы и почему их не надо использовать - Альтернативы union'ам: std::variant --- Майлстоун. Вы знаете, как устроены указатели. Можно начинать собеситься на простые вакансии -[] I/O, Стримы +# I/O, Стримы - Концепция стримов - Читать/писать из файла -[] Лямбда-функции +# Лямбда-функции - Понятия callable object, functor, closure - Синтаксис лямбды - Как менялся синтаксис в разных стандартах - Техники использования лямбд -[] Компайл-тайм vs рантайм +# Компайл-тайм vs рантайм - constexpr, consteval, constinit -[] Шаблоны: основы +# Шаблоны: основы - синтаксис объявления шаблонов - SFINAE - перегрузка функций vs шаблонные функции -[] Специализация шаблонов +# Специализация шаблонов - полная специализация шаблонов - частичная специализация шаблонов (неплохо рассказать почему недоступна для функций) -[] Вариадики +# Вариадики - Синтаксис вариадиков. Многоточие - Пакет параметров (Parameter pack) - sizeof...() - выражения свертки (Fold expressions) -[] Шаблоны на практике +# Шаблоны на практике - полезные варианты использования шаблонов: traits (типажи), стратегии - механизм инстанцирования шаблонов и методы сокращения раздувание кода: локальные шаблоны, локальная инстанцирования шаблонов -[] Конкурентность: обзор +# Конкурентность: обзор - Потоки, thread_local - Процессы - Futures/promises @@ -274,7 +274,7 @@ - Примитивы синхронизации - Модель памяти -[] Директивы препроцессора +# Директивы препроцессора - define - ifdef - ifndef, ... @@ -282,15 +282,15 @@ --- Майлстоун. Вы познакомились с самыми важными аспектами C++. Можно разбираться в опенсорс проектах и не впадать в ступор -[] Концепты +# Концепты -[] Модули +# Модули -[] Undefined & unspecified behavior +# Undefined & unspecified behavior -[] Интероп C++ и других языков +# Интероп C++ и других языков -[] Мой код не работает, и я не знаю, почему +# Мой код не работает, и я не знаю, почему - Отладка - gdb - Профилирование From 70445ffa3e116d005cac8e9f3162debb0345bfe0 Mon Sep 17 00:00:00 2001 From: Microvenator Date: Wed, 27 Nov 2024 07:10:38 +0300 Subject: [PATCH 03/36] review fix --- cpp/contents.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index 5abb3f5e..b2af04a9 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -161,7 +161,7 @@ - Исключения в деструкторах, noexcept - Как написать класс, соответствующий RAII без исключений -Наследование и полиморфизм +# Наследование и полиморфизм - Наследование, переопределение методов - Абстрактные классы, virtual, override, final - Таблица виртуальных функций (для одиночного наследования) @@ -248,23 +248,24 @@ - constexpr, consteval, constinit # Шаблоны: основы -- синтаксис объявления шаблонов +- Синтаксис объявления шаблонов +- Как работает инстанцирование шаблонов - SFINAE -- перегрузка функций vs шаблонные функции +- Перегрузка функций vs шаблонные функции # Специализация шаблонов -- полная специализация шаблонов -- частичная специализация шаблонов (неплохо рассказать почему недоступна для функций) +- Полная специализация шаблонов +- Частичная специализация шаблонов (почему недоступна для функций) # Вариадики - Синтаксис вариадиков. Многоточие - Пакет параметров (Parameter pack) - sizeof...() -- выражения свертки (Fold expressions) +- Выражения свертки (Fold expressions) # Шаблоны на практике -- полезные варианты использования шаблонов: traits (типажи), стратегии -- механизм инстанцирования шаблонов и методы сокращения раздувание кода: локальные шаблоны, локальная инстанцирования шаблонов +- Полезные варианты использования шаблонов: traits (типажи), стратегии +- Методы сокращения раздувание кода: локальные шаблоны, локальное инстанцирование шаблонов # Конкурентность: обзор - Потоки, thread_local From 1708afec065848a14ef924de848e48a6f1400b9b Mon Sep 17 00:00:00 2001 From: Microvenator Date: Thu, 28 Nov 2024 08:03:24 +0300 Subject: [PATCH 04/36] review fixes --- cpp/contents.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cpp/contents.md b/cpp/contents.md index b2af04a9..b5246883 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -54,7 +54,8 @@ - Встроенные типы - int, char, ... и что с ними можно делать - Модификаторы типов signed, unsigned, long и short - Основные операторы: арифметические, логические, ... -- Вывод типов, auto +- typeid, std::type_info +- Вывод типов, auto, decltype - Ссылки и указатели # Операторы From f82906c028d9dff6ec50b52fe187dad28f59b807 Mon Sep 17 00:00:00 2001 From: Microvenator Date: Thu, 28 Nov 2024 08:25:12 +0300 Subject: [PATCH 05/36] Review update --- cpp/contents.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index b5246883..98d0d3de 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -245,9 +245,6 @@ - Как менялся синтаксис в разных стандартах - Техники использования лямбд -# Компайл-тайм vs рантайм -- constexpr, consteval, constinit - # Шаблоны: основы - Синтаксис объявления шаблонов - Как работает инстанцирование шаблонов @@ -268,6 +265,10 @@ - Полезные варианты использования шаблонов: traits (типажи), стратегии - Методы сокращения раздувание кода: локальные шаблоны, локальное инстанцирование шаблонов +# Компайл-тайм vs рантайм +- constexpr, consteval, constinit +- if constexpr + # Конкурентность: обзор - Потоки, thread_local - Процессы From 5e3cdf4ed1fe182921e2bdff1a98a2e88f873245 Mon Sep 17 00:00:00 2001 From: Microvenator Date: Fri, 29 Nov 2024 12:47:52 +0300 Subject: [PATCH 06/36] UB & ranges switch --- cpp/contents.md | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index 98d0d3de..082acd0b 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -88,6 +88,12 @@ - Перегрузка функций - inline +# Что такое UB +- Undefined, unspecified, implementation-defined поведение: в чем разница +- Для чего в языке нужен UB +- Как искать UB в своем коде +- Примеры UB + # Знакомство с stl - Контейнеры. Классификация. Адаптеры для контейнеров - Итераторы @@ -118,13 +124,6 @@ # Алгоритмы - Основные алгоритмы типа std::sort, std::find, ... -# Рейнджи -- Библиотека ranges: обзор -- Объединение операций через пайп -- Алгоритмы -- views -- Адаптеры - --- Майлстоун. Вы знаете базовый синтаксис и умеете работать с контейнерами. Можно решать задачи на лееткоде и хакерранке @@ -285,12 +284,17 @@ --- Майлстоун. Вы познакомились с самыми важными аспектами C++. Можно разбираться в опенсорс проектах и не впадать в ступор +# Рейнджи +- Библиотека ranges: обзор +- Объединение операций через пайп +- Алгоритмы +- views +- Адаптеры + # Концепты # Модули -# Undefined & unspecified behavior - # Интероп C++ и других языков # Мой код не работает, и я не знаю, почему From 0e36337d9383cae5f4874a5f7316dd82151c3a78 Mon Sep 17 00:00:00 2001 From: Microvenator Date: Sat, 30 Nov 2024 08:51:28 +0300 Subject: [PATCH 07/36] std::error_code, variant types --- cpp/contents.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cpp/contents.md b/cpp/contents.md index 082acd0b..8e74caf4 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -136,7 +136,10 @@ - noexcept - Ассерты - Коды возврата -- std::optional + - std::error_code +- variant types + - std::optional + - std::exptected # Классы: основы - Конструкторы, деструкторы, RAII From 1e87f7bd700be6ae0fd3f8606d50ae5a1026e9db Mon Sep 17 00:00:00 2001 From: Microvenator Date: Sat, 30 Nov 2024 19:32:28 +0300 Subject: [PATCH 08/36] more idioms --- cpp/contents.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index 8e74caf4..abd9bdaf 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -109,6 +109,7 @@ # Массивы - std::vector - std::array +- Идиома erase-remove # Списочные коллекции - std::list @@ -142,12 +143,14 @@ - std::exptected # Классы: основы -- Конструкторы, деструкторы, RAII +- Конструкторы, деструкторы +- Идиома RAII +- Перегрузка конструктора - Ключевое слово explicit - protected, public, private, friends - Отличие классов и структур - this, static -- порядок создания и удаления членов данных (также про исключение про статик) +- Порядок создания и удаления членов данных (также про исключение про статик) - const, mutable - forward declaration @@ -158,6 +161,8 @@ - Правило 3 (5) - Спецификаторы =default, =delete - Использование std::move(), std::forward() +- Идиома Copy and Swap +- Идиома Non-Copyable/Non-Moveable # Обработка ошибок в классах - Исключения в конструкторах @@ -221,8 +226,9 @@ # Указатели и ссылки - Адресная арифметика - Массивы -- Управление ресурсами +- Управление ресурсами, new/delete - Утечки памяти +- Идиома pimpl - Необходимость в RAII и умных указателях # Умные указатели From ffd7c5ae0e49e10d5e0cafb412920b980be9d314 Mon Sep 17 00:00:00 2001 From: Microvenator Date: Sun, 1 Dec 2024 09:11:59 +0300 Subject: [PATCH 09/36] More about std containers, algo, etc --- cpp/contents.md | 71 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 53 insertions(+), 18 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index abd9bdaf..c958828e 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -54,7 +54,7 @@ - Встроенные типы - int, char, ... и что с ними можно делать - Модификаторы типов signed, unsigned, long и short - Основные операторы: арифметические, логические, ... -- typeid, std::type_info +- RTTI: typeid, std::type_info - Вывод типов, auto, decltype - Ссылки и указатели @@ -94,12 +94,12 @@ - Как искать UB в своем коде - Примеры UB -# Знакомство с stl -- Контейнеры. Классификация. Адаптеры для контейнеров -- Итераторы -- std::span -- Алгоритмы -- Кратко о том, что еще есть в stl: умные указатели и тд +# Обзор стандартных контейнеров и алгоритмов +- STL: контейнеры, итераторы, алгоритмы, функторы +- Классификация контейнеров: Sequential, Associative, Unordered associative и Adapters +- bitset и valarray +- Абстракция "Итератор" +- Что еще есть в стандартной библиотеке # Строки - std::string, @@ -111,19 +111,37 @@ - std::array - Идиома erase-remove -# Списочные коллекции +# Списки - std::list - std::forward_list -- std::deque, ... + +# Очереди +- std::deque +- Адаптер std::stack +- Адаптер std::queue +- Адаптер std::priority_queue # Ассоциативные контейнеры - std::map -- std::unordered_map - std::set +- std::multimap, std::multiset +- Адаптеры std::flat_map и std::flat_set, std::flat_multiset, std::flat_multimap + +# Неупорядоченные ассоциативные контейнеры +- std::unordered_map - std::unordered_set +- std::unordered_multimap, std::unordered_multiset # Алгоритмы -- Основные алгоритмы типа std::sort, std::find, ... +- Не модифицирующие алгоримы над последовательностями: all_if, any_of, find, ... +- Модифицирующие алгоритмы: copy, copy_if, transform, ... +- Деление на группы: partition, is_partition, ... +- Сортировки: sort, is_sorted, ... +- Бинарный поиск: binary_search, lower_bound, upper_bound, ... +- Объединение: merge, set_union, ... +- Куча: push_heap, pop_heap, ... +- Поиск минимума/максимума: min, max, ... +- Какие еще есть алгоритмы --- Майлстоун. Вы знаете базовый синтаксис и умеете работать с контейнерами. Можно решать задачи на лееткоде и хакерранке @@ -142,25 +160,32 @@ - std::optional - std::exptected +# Семантика копирования и перемещения +- Копирование vs перемещение +- Что такое владение +- Использование std::move() +- Сравнение производительности + # Классы: основы - Конструкторы, деструкторы - Идиома RAII - Перегрузка конструктора - Ключевое слово explicit +- forward declaration +- Спецификаторы =default, =delete + +# Поля класса - protected, public, private, friends - Отличие классов и структур - this, static -- Порядок создания и удаления членов данных (также про исключение про статик) +- Порядок создания и удаления полей (также про исключение про статик) - const, mutable -- forward declaration -# Копирование и перемещение объектов +# Реализация копирования и перемещения - Конструкторы и операторы копирования, перемещения - Как надо писать конструкторы и операторы копирования, перемещения (сохранение предыдущего состояни при ошибке, пример реализации через swap()) - Неявное преобразование и explicit - Правило 3 (5) -- Спецификаторы =default, =delete -- Использование std::move(), std::forward() - Идиома Copy and Swap - Идиома Non-Copyable/Non-Moveable @@ -192,7 +217,7 @@ - Явное и неявное приведение - c-style cast и его проблемы - static_cast -- dynamic_cast +- dynamic_cast: RTTI для приведения типов - const_cast - reinterpret_cast @@ -229,12 +254,15 @@ - Управление ресурсами, new/delete - Утечки памяти - Идиома pimpl +- Views std::span, std::mdspan - Необходимость в RAII и умных указателях # Умные указатели - unique - shared - weak +- make_shared, make_unique +- nullptr # Объединения - Union'ы и почему их не надо использовать @@ -248,6 +276,7 @@ - Читать/писать из файла # Лямбда-функции +- Мотивация для лямбд: std::find() -> std::find_if(), std::sort() и тд - Понятия callable object, functor, closure - Синтаксис лямбды - Как менялся синтаксис в разных стандартах @@ -273,6 +302,12 @@ - Полезные варианты использования шаблонов: traits (типажи), стратегии - Методы сокращения раздувание кода: локальные шаблоны, локальное инстанцирование шаблонов +# Об оптимизациях +- COW. Плюсы и минусы +- Perfect forwarding +- RVO +- NRVO + # Компайл-тайм vs рантайм - constexpr, consteval, constinit - if constexpr @@ -281,7 +316,7 @@ - Потоки, thread_local - Процессы - Futures/promises -- Корутины +- Корутины, std::generator - Примитивы синхронизации - Модель памяти From 9d1661eae0b25a3a86a8af1ecc4a01eafc998e03 Mon Sep 17 00:00:00 2001 From: Microvenator Date: Tue, 3 Dec 2024 08:52:01 +0300 Subject: [PATCH 10/36] Practice projects --- cpp/contents.md | 81 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 57 insertions(+), 24 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index c958828e..f5a5e5d0 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -68,6 +68,9 @@ - Другие операторы: member access, вызов функции, ... - Приоритет операторов +# ПРОЕКТ. Деление без деления +- Реализовать целочисленное деление без использования операций деления, умножения и получения остатка + # Условия - if - if с инициализатором @@ -106,6 +109,15 @@ - std::string_view - std::wstring +# Форматирование и ввод/вывод +- Знакомство со стримами +- std::format +- std::print +- Файлы + +# ПРОЕКТ. Утилита tree +- Консольная утилита для демонстрации иерархии директорий в виде дерева + # Массивы - std::vector - std::array @@ -121,6 +133,9 @@ - Адаптер std::queue - Адаптер std::priority_queue +# ПРОЕКТ. Скользящее среднее +- Реализовать алгоритм скользящего среднего + # Ассоциативные контейнеры - std::map - std::set @@ -143,6 +158,9 @@ - Поиск минимума/максимума: min, max, ... - Какие еще есть алгоритмы +# ПРОЕКТ. Калькулятор алгебраических выражений +- Для строки с алгебраическим выражением, например, "81.0-(2.5+1)/3", вернуть его значение + --- Майлстоун. Вы знаете базовый синтаксис и умеете работать с контейнерами. Можно решать задачи на лееткоде и хакерранке @@ -152,7 +170,9 @@ # Обработка ошибок - Исключения -- noexcept + - Как работает раскрутка стека + - Базовая гарантия исключений + - noexcept - Ассерты - Коды возврата - std::error_code @@ -164,36 +184,50 @@ - Копирование vs перемещение - Что такое владение - Использование std::move() +- rvalue ссылки - Сравнение производительности # Классы: основы - Конструкторы, деструкторы - Идиома RAII - Перегрузка конструктора -- Ключевое слово explicit +- Неявное преобразование и explicit - forward declaration - Спецификаторы =default, =delete # Поля класса - protected, public, private, friends +- member initialization list - Отличие классов и структур - this, static - Порядок создания и удаления полей (также про исключение про статик) - const, mutable -# Реализация копирования и перемещения -- Конструкторы и операторы копирования, перемещения -- Как надо писать конструкторы и операторы копирования, перемещения (сохранение предыдущего состояни при ошибке, пример реализации через swap()) -- Неявное преобразование и explicit -- Правило 3 (5) -- Идиома Copy and Swap -- Идиома Non-Copyable/Non-Moveable +# Перегрузка операторов +- Операторы сравнения +- Spaceship operator +- Операторы присваивания +- Реализация одних операторов через другие +- Унарные операции +- Инкремент, декремент +- Другие операторы: <<, ... + +# ПРОЕКТ. Класс для представления числа в виде дроби +- Реализовать класс для представления числа в виде дроби a/b. Перегрузить для него набор операторов # Обработка ошибок в классах - Исключения в конструкторах - Исключения в деструкторах, noexcept - Как написать класс, соответствующий RAII без исключений +# Реализация копирования и перемещения +- Конструкторы и операторы копирования, перемещения +- Как надо писать конструкторы и операторы копирования, перемещения (сохранение предыдущего состояни при ошибке, пример реализации через swap()) +- Правило трех, пяти, нуля +- Аннотация методов +- Идиома Copy and Swap +- Идиома Non-Copyable/Non-Moveable + # Наследование и полиморфизм - Наследование, переопределение методов - Абстрактные классы, virtual, override, final @@ -204,15 +238,6 @@ - Виртуальное наследование - Таблица виртуальных функций (для множественного наследования) -# Перегрузка операторов -- Операторы сравнения -- Spaceship operator -- Операторы присваивания -- Реализация одних операторов через другие -- Унарные операции -- Инкремент, декремент -- Другие операторы: <<, ... - # Приведение типов - Явное и неявное приведение - c-style cast и его проблемы @@ -221,6 +246,9 @@ - const_cast - reinterpret_cast +# ПРОЕКТ. LRU-кэш +- Реализовать класс LRU-кэша, отнаследованный от базового абстрактного класса Cache + --- Майлстоун. Вы умеете строить абстракции. Можно заводить пет-проект @@ -257,6 +285,9 @@ - Views std::span, std::mdspan - Необходимость в RAII и умных указателях +# ПРОЕКТ. Свой класс Строка +- Реализовать класс Строка с ограниченным набором методов + # Умные указатели - unique - shared @@ -271,10 +302,6 @@ --- Майлстоун. Вы знаете, как устроены указатели. Можно начинать собеситься на простые вакансии -# I/O, Стримы -- Концепция стримов -- Читать/писать из файла - # Лямбда-функции - Мотивация для лямбд: std::find() -> std::find_if(), std::sort() и тд - Понятия callable object, functor, closure @@ -302,6 +329,8 @@ - Полезные варианты использования шаблонов: traits (типажи), стратегии - Методы сокращения раздувание кода: локальные шаблоны, локальное инстанцирование шаблонов +# ПРОЕКТ. Свой умный указатель + # Об оптимизациях - COW. Плюсы и минусы - Perfect forwarding @@ -312,14 +341,18 @@ - constexpr, consteval, constinit - if constexpr -# Конкурентность: обзор +# Обзор конкурентности в C++ - Потоки, thread_local - Процессы - Futures/promises - Корутины, std::generator -- Примитивы синхронизации - Модель памяти +# Примитивы синхронизации + +# ПРОЕКТ. Поисковый движок +- Реализовать сервис с элементарным поисковым движком. Под капотом тред пул, разделяющий тяжелый объект + # Директивы препроцессора - define - ifdef From 8f5d58c7ef0dd8d6965d2d1ef7f2692073726af8 Mon Sep 17 00:00:00 2001 From: Microvenator Date: Tue, 3 Dec 2024 15:05:12 +0300 Subject: [PATCH 11/36] Spiral approach --- cpp/contents.md | 277 +++++++++++++++++++++++++++++++----------------- 1 file changed, 179 insertions(+), 98 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index f5a5e5d0..624ccd6e 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -1,6 +1,13 @@ -# Содержание курса по C++ +**Содержание курса по C++** -В этом драфте мы устаканиваем содержание курса по C++. +Это попытка организовать обучение по спирали. Одни и те же темы будут всплывать неоднократно по мере углубления понимания C++. При этом в главах будут расставлены кросс-ссылки, чтобы было удобнее использовать курс как справочник и для подготовки к собесам. + +# О курсе +- Цель курса +- Для кого этот курс +- Для кого этот курс не подходит +- Как проходить курс +- Что делать, если возникают сложности # Что такое C++ - Отличительные свойства @@ -29,60 +36,48 @@ - ...шаблоны - ...макросы -# Сборка проекта +# Как собрать и запустить простой проект - Организация проекта - Что такое компиляция - Компиляторы C++ -- Пайплайн компиляции - - Препроцессор - - Компилятор - - Ассемблер - - Линковщик -- C++ ABI -- Библиотеки - - Статические библиотеки - - Динамические библиотеки - - Header-only библиотеки -- Рантайм C++ -- Автоматизация сборки - - Make - - CMake - - Пакетные менеджеры +- Компиляция в командной строке +- Введение в CMake # Типы данных - Классификация типов - что такое POD, фундаментальный тип, скалярный тип и тд - Встроенные типы - int, char, ... и что с ними можно делать - Модификаторы типов signed, unsigned, long и short - Основные операторы: арифметические, логические, ... -- RTTI: typeid, std::type_info -- Вывод типов, auto, decltype -- Ссылки и указатели +- Кратко: что такое ссылки и указатели # Операторы - Присваивание - Инкремент, декремент - Арифметические операторы - Логические операторы -- Порядок вычисления логических выражений +- Порядок вычисления логических выражений (операндов && и ||) - Сравнение -- Другие операторы: member access, вызов функции, ... - Приоритет операторов # ПРОЕКТ. Деление без деления -- Реализовать целочисленное деление без использования операций деления, умножения и получения остатка +- Алгоритм целочисленного деления без использования операций деления, умножения и получения остатка # Условия - if -- if с инициализатором -- Порядок вычисл -- тернарный оператор -- switch +- Тернарный оператор +- switch-case +- Инициализаторы в if и switch-case # Циклы - Варианты for -- while, do while +- while +- do-while - continue, break -- goto + +# Ссылки +- Мотивация +- Синтаксис +- Продление жизни временных объектов # Функции - Способы передачи аргументов @@ -97,6 +92,10 @@ - Как искать UB в своем коде - Примеры UB +# Автоматический вывод типов +- auto +- RTTI: typeid, std::type_info + # Обзор стандартных контейнеров и алгоритмов - STL: контейнеры, итераторы, алгоритмы, функторы - Классификация контейнеров: Sequential, Associative, Unordered associative и Adapters @@ -105,16 +104,19 @@ - Что еще есть в стандартной библиотеке # Строки -- std::string, -- std::string_view +- std::string - std::wstring # Форматирование и ввод/вывод -- Знакомство со стримами +- Концепция стримов - std::format - std::print - Файлы +# Алиасы +- typedef +- using + # ПРОЕКТ. Утилита tree - Консольная утилита для демонстрации иерархии директорий в виде дерева @@ -134,7 +136,7 @@ - Адаптер std::priority_queue # ПРОЕКТ. Скользящее среднее -- Реализовать алгоритм скользящего среднего +- Алгоритм скользящего среднего в некоем окне # Ассоциативные контейнеры - std::map @@ -156,6 +158,7 @@ - Объединение: merge, set_union, ... - Куча: push_heap, pop_heap, ... - Поиск минимума/максимума: min, max, ... +- Параллельные алгоритмы - Какие еще есть алгоритмы # ПРОЕКТ. Калькулятор алгебраических выражений @@ -168,17 +171,11 @@ - enum - enum class -# Обработка ошибок -- Исключения - - Как работает раскрутка стека - - Базовая гарантия исключений - - noexcept -- Ассерты -- Коды возврата - - std::error_code -- variant types - - std::optional - - std::exptected +# Исключения +- Синтаксис +- Как работает раскрутка стека +- Базовая гарантия исключений +- noexcept # Семантика копирования и перемещения - Копирование vs перемещение @@ -188,32 +185,38 @@ - Сравнение производительности # Классы: основы -- Конструкторы, деструкторы +- Поля и методы +- Спецификаторы доступа protected, public, private +- friend +- Отличие классов и структур +- forward declaration + +# Конструкторы и деструкторы +- Синтаксис - Идиома RAII - Перегрузка конструктора - Неявное преобразование и explicit -- forward declaration - Спецификаторы =default, =delete # Поля класса -- protected, public, private, friends -- member initialization list -- Отличие классов и структур -- this, static +- Инициализация полей через member initialization list +- this +- static - Порядок создания и удаления полей (также про исключение про статик) - const, mutable # Перегрузка операторов +- Операторы присваивания - Операторы сравнения + - Как правильно писать компараторы - Spaceship operator -- Операторы присваивания - Реализация одних операторов через другие - Унарные операции - Инкремент, декремент - Другие операторы: <<, ... # ПРОЕКТ. Класс для представления числа в виде дроби -- Реализовать класс для представления числа в виде дроби a/b. Перегрузить для него набор операторов +- Класс для представления числа в виде дроби целых a/b. Перегрузить для него набор операторов # Обработка ошибок в классах - Исключения в конструкторах @@ -228,15 +231,27 @@ - Идиома Copy and Swap - Идиома Non-Copyable/Non-Moveable -# Наследование и полиморфизм +# Наследование и динамический полиморфизм - Наследование, переопределение методов - Абстрактные классы, virtual, override, final - Таблица виртуальных функций (для одиночного наследования) -# Множественное наследование -- Про множественное наследование. Ромбовидное наследование, проблемы -- Виртуальное наследование -- Таблица виртуальных функций (для множественного наследования) +# Шаблоны и статический полиморфизм +- Синтаксис объявления шаблонов +- Как работает инстанцирование шаблонов +- decltype +- SFINAE +- Перегрузка функций vs шаблонные функции + +# Специализация шаблонов +- Полная специализация шаблонов +- Частичная специализация шаблонов (почему недоступна для функций) + +# ПРОЕКТ. LRU-кэш +- Класс LRU-кэша, отнаследованный от базового абстрактного класса Cache + +--- +Майлстоун. Вы умеете строить абстракции. Можно заводить пет-проект # Приведение типов - Явное и неявное приведение @@ -246,12 +261,6 @@ - const_cast - reinterpret_cast -# ПРОЕКТ. LRU-кэш -- Реализовать класс LRU-кэша, отнаследованный от базового абстрактного класса Cache - ---- -Майлстоун. Вы умеете строить абстракции. Можно заводить пет-проект - # Инициализация - Варианты инициализации - Most vexing parse @@ -265,9 +274,6 @@ - Вложенные пространства имен - ADL -# Алиасы -- typedef, using - # Распаковка - std::tie, std::pair - Structured Binding @@ -276,48 +282,68 @@ - Стэк, хип, статическая память - volatile, static -# Указатели и ссылки +# Указатели +- Концепция указателя +- nullptr - Адресная арифметика - Массивы -- Управление ресурсами, new/delete -- Утечки памяти +- Управление ресурсами, new/delete vs memalloc/free - Идиома pimpl -- Views std::span, std::mdspan + +# Опасности при работе с указателями +- Утечки памяти + - Освобождение ресурсов в Си-стиле: goto +- Двойное освобождение +- Выход за границы - Необходимость в RAII и умных указателях # ПРОЕКТ. Свой класс Строка -- Реализовать класс Строка с ограниченным набором методов +- Класс Строка с ограниченным набором методов # Умные указатели - unique - shared - weak - make_shared, make_unique -- nullptr -# Объединения -- Union'ы и почему их не надо использовать -- Альтернативы union'ам: std::variant +# Невладеющие представления +- std::string_view +- std::span, std::mdspan ---- -Майлстоун. Вы знаете, как устроены указатели. Можно начинать собеситься на простые вакансии +# Сборка проекта: подробности +- Пайплайн компиляции + - Препроцессор + - Компилятор + - Ассемблер + - Линковщик +- C++ ABI +- Библиотеки + - Статические библиотеки + - Динамические библиотеки + - Header-only библиотеки +- Рантайм C++ +- Автоматизация сборки + - Make + - CMake + - Пакетные менеджеры -# Лямбда-функции -- Мотивация для лямбд: std::find() -> std::find_if(), std::sort() и тд -- Понятия callable object, functor, closure -- Синтаксис лямбды -- Как менялся синтаксис в разных стандартах -- Техники использования лямбд +--- +Майлстоун. Вы знаете важные концепции C++. Можно начинать собеситься на простые вакансии -# Шаблоны: основы -- Синтаксис объявления шаблонов -- Как работает инстанцирование шаблонов -- SFINAE -- Перегрузка функций vs шаблонные функции +# Стратегии обработки ошибок +- Иерархия классов исключений +- Когда исключения не подходят +- Ассерты для проверки инвариантов при отладке +- Коды возврата + - std::error_code +- variant types + - std::optional + - std::exptected -# Специализация шаблонов -- Полная специализация шаблонов -- Частичная специализация шаблонов (почему недоступна для функций) +# Множественное наследование +- Про множественное наследование. Ромбовидное наследование, проблемы +- Виртуальное наследование +- Таблица виртуальных функций (для множественного наследования) # Вариадики - Синтаксис вариадиков. Многоточие @@ -326,10 +352,22 @@ - Выражения свертки (Fold expressions) # Шаблоны на практике -- Полезные варианты использования шаблонов: traits (типажи), стратегии -- Методы сокращения раздувание кода: локальные шаблоны, локальное инстанцирование шаблонов +- Полезные техники использования шаблонов + - traits (типажи) + - Стратегии +- Методы сокращения раздувание кода + - Локальные шаблоны + - Локальное инстанцирование шаблонов # ПРОЕКТ. Свой умный указатель +- Простой умный указатель для single-thread использования + +# Лямбда-функции +- Мотивация для лямбд: std::find() -> std::find_if(), std::sort() и тд +- Понятия callable object, functor, closure +- Синтаксис лямбды +- Как менялся синтаксис в разных стандартах +- Техники использования лямбд # Об оптимизациях - COW. Плюсы и минусы @@ -341,6 +379,10 @@ - constexpr, consteval, constinit - if constexpr +# Объединения +- Union'ы и почему их не надо использовать +- Альтернативы union'ам: std::variant, std::any + # Обзор конкурентности в C++ - Потоки, thread_local - Процессы @@ -348,15 +390,28 @@ - Корутины, std::generator - Модель памяти -# Примитивы синхронизации - -# ПРОЕКТ. Поисковый движок -- Реализовать сервис с элементарным поисковым движком. Под капотом тред пул, разделяющий тяжелый объект +# Синхронизация между потоками +- std::atomic +- std::mutex +- std::condition_variable + - spurious wakeup +- Блокировки + - std::scoped_lock + - std::lock_guard + - std::unique_lock +- std::counting_semaphore, std::binary_semaphore +- std::barriers +- std::latch # Директивы препроцессора - define - ifdef - ifndef, ... +- Макросы и почему их лучше избегать + + +# ПРОЕКТ. Поисковый движок +- Сервис с элементарным поисковым движком. Под капотом тред пул, разделяющий тяжелый объект --- Майлстоун. Вы познакомились с самыми важными аспектами C++. Можно разбираться в опенсорс проектах и не впадать в ступор @@ -369,8 +424,23 @@ - Адаптеры # Концепты +- Мотивация +- Семантические требования к параметрам шаблона +- Стандартные концепты +- Варианты использования constraint'ов +- Преимущества концептов +- Практические примеры # Модули +- Модули vs хедеры +- Собственные модули +- Импорт модулей +- Стандартные модули + +# Подкапотная магия компилятора +- Frontend, middle-end, backend +- IR, parse tree, AST, ... +- Подводка к рефлексии # Интероп C++ и других языков @@ -384,5 +454,16 @@ - AddressSanitizer - memcheck +# ПРОЕКТ. BadBadMap +Дан класс с самописной мапой. В сишном стиле, с макросами, утечками и другими радостями. Нужно отрефакторить на современный C++ + +# Куда двигаться дальше +- Какие темы C++ стоит копнуть глубже + - Конкурентность + - Шаблоны и концепты + - Compile-time вычисления + - ... +- Список полезных ресурсов + --- Майлстоун. Можно считать себя C++ разработчиком \ No newline at end of file From b0aeeb923f9a40d08a6546a65fa5b06dc6a08ef6 Mon Sep 17 00:00:00 2001 From: Microvenator Date: Tue, 3 Dec 2024 15:24:46 +0300 Subject: [PATCH 12/36] IF, IFNDR --- cpp/contents.md | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index 624ccd6e..d5696dc6 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -86,11 +86,15 @@ - Перегрузка функций - inline -# Что такое UB -- Undefined, unspecified, implementation-defined поведение: в чем разница -- Для чего в языке нужен UB -- Как искать UB в своем коде -- Примеры UB +# Два вида "не делайте так" +- Что такое UB + - Undefined, unspecified, implementation-defined поведение: в чем разница + - Для чего в языке нужен UB + - Как искать UB в своем коде + - Примеры UB +- Что такое ill-formed program + - IF + - IFNDR # Автоматический вывод типов - auto @@ -177,13 +181,6 @@ - Базовая гарантия исключений - noexcept -# Семантика копирования и перемещения -- Копирование vs перемещение -- Что такое владение -- Использование std::move() -- rvalue ссылки -- Сравнение производительности - # Классы: основы - Поля и методы - Спецификаторы доступа protected, public, private @@ -223,6 +220,13 @@ - Исключения в деструкторах, noexcept - Как написать класс, соответствующий RAII без исключений +# Семантика копирования и перемещения +- Копирование vs перемещение +- Что такое владение +- Использование std::move() +- rvalue ссылки +- Сравнение производительности + # Реализация копирования и перемещения - Конструкторы и операторы копирования, перемещения - Как надо писать конструкторы и операторы копирования, перемещения (сохранение предыдущего состояни при ошибке, пример реализации через swap()) From e95b348fa182fc4fec67ba0a2a16abac850c044f Mon Sep 17 00:00:00 2001 From: Microvenator Date: Mon, 30 Dec 2024 12:57:34 +0300 Subject: [PATCH 13/36] Update status for chapters 0, 1 --- cpp/contents.md | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index d5696dc6..1f7be2f6 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -2,20 +2,38 @@ Это попытка организовать обучение по спирали. Одни и те же темы будут всплывать неоднократно по мере углубления понимания C++. При этом в главах будут расставлены кросс-ссылки, чтобы было удобнее использовать курс как справочник и для подготовки к собесам. -# О курсе +# Глава 0. О курсе [DONE] - Цель курса +- Наш подход к обучению - Для кого этот курс - Для кого этот курс не подходит - Как проходить курс -- Что делать, если возникают сложности - -# Что такое C++ -- Отличительные свойства -- Сильные и слабые стороны -- Области применения +- Ответы на частые вопросы + - Нужно ли начинать изучение C++ с Си? + - Нужно ли для изучения C++ знать ассемблер? + - Что делать, если не получается решить задачу или выполнить проект? + - Куда сообщать об ошибках? + +# Глава 1. Что такое C++ [DONE] +- Философия С++ + - Свобода выбора + - Обратная совместимость + - Эффективность +- Что делает язык C++ языком C++ + - Слабая статическая типизация + - ООП + - Метапрограммирование +- Развитие языка +- Экосистема вокруг языка + - Сборка + - IDE и редакторы + - Библиотеки и фреймворки + - Линтеры, форматтеры и статические анализаторы кода - Мифы о C++ -- Инфраструктура вокруг языка - сборка, буст, тесты, пакетирование, статические анализаторы, линтеры, core guidelines, ... -- Кто и зачем развивает C++ - история, комитет, стандарт + - Мифический язык C/C++ + - C++ небезопасен +- Области применения C++ + # Базовые концепции - Инструкции (statements), операторы (operators), выражения (expressions), точка с запятой From 12765eb6aac9a7b98f0e5f3d9c52dcc64d42360b Mon Sep 17 00:00:00 2001 From: Microvenator Date: Thu, 2 Jan 2025 20:27:40 +0300 Subject: [PATCH 14/36] Chapter 3 split to multiple chapters --- cpp/contents.md | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index 1f7be2f6..65828795 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -34,28 +34,43 @@ - C++ небезопасен - Области применения C++ - -# Базовые концепции -- Инструкции (statements), операторы (operators), выражения (expressions), точка с запятой -- Переменные, литералы, константы +# Глава 2. Простые функции [IN PROGRESS] +- Точка входа в программу +- Сигнатура и тело функции +- Возвращаемое значение +- Аргументы + - Передача аргументов по значению + - Передача аргументов по константному значению - Объявления и определения -- Структура программы +- Оформление кода + +# Переменные +- Основные типы +- Основные способы инициализации - Области видимости - Время жизни локальных переменных -- Точка входа main() + +# Основные конструкции +- if-else +- switch-case +- while +- do-while +- for + +# Структура программы +- Проекты до C++20 + - Подключение хедеров +- Проекты после C++20: появление модулей + - Импорт модулей # Экскурсия по C++ -- Как выглядят условия, -- ...циклы, -- ...функции, -- ...классы, +- Как выглядят классы, - ...enum, - ...нэймспэйсы, - ...шаблоны - ...макросы # Как собрать и запустить простой проект -- Организация проекта - Что такое компиляция - Компиляторы C++ - Компиляция в командной строке From 268c0bf5b9075c77d9179b0293b15e07526857c3 Mon Sep 17 00:00:00 2001 From: Microvenator Date: Thu, 16 Jan 2025 08:14:52 +0300 Subject: [PATCH 15/36] update for chapter 2 --- cpp/contents.md | 42 +++++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index 65828795..5a0301a5 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -34,15 +34,34 @@ - C++ небезопасен - Области применения C++ -# Глава 2. Простые функции [IN PROGRESS] +# Глава 2. Базовый синтаксис [IN PROGRESS] +- Правила именования +- Правила форматирования - Точка входа в программу -- Сигнатура и тело функции -- Возвращаемое значение -- Аргументы - - Передача аргументов по значению - - Передача аргументов по константному значению -- Объявления и определения -- Оформление кода +- Функции +- Переменные +- Константы +- Несколько фундаментальных типов + - Типы int и double + - Тип bool + - Тип char + - Тип void +- Операторы + - Операторы сравнения + - Логические операторы + - Арифметические операторы + - Составное присваивание + - Инкремент и декремент + - Приоритет операторов + +# Управляющие конструкции +- Условия if-else +- Тернарный оператор +- Выбор через switch-case +- Циклы + - Цикл while + - Цикл do-while + - Цикл for # Переменные - Основные типы @@ -50,13 +69,6 @@ - Области видимости - Время жизни локальных переменных -# Основные конструкции -- if-else -- switch-case -- while -- do-while -- for - # Структура программы - Проекты до C++20 - Подключение хедеров From 78883a76aebc7b6eeb3ffd3b97dbc0df0c83a60d Mon Sep 17 00:00:00 2001 From: Microvenator Date: Thu, 16 Jan 2025 08:29:57 +0300 Subject: [PATCH 16/36] Update --- cpp/contents.md | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index 5a0301a5..2b89cad6 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -64,8 +64,7 @@ - Цикл for # Переменные -- Основные типы -- Основные способы инициализации +- Несколько способов инициализации - Области видимости - Время жизни локальных переменных @@ -81,6 +80,7 @@ - ...нэймспэйсы, - ...шаблоны - ...макросы +- ...исключения # Как собрать и запустить простой проект - Что такое компиляция @@ -92,18 +92,9 @@ - Классификация типов - что такое POD, фундаментальный тип, скалярный тип и тд - Встроенные типы - int, char, ... и что с ними можно делать - Модификаторы типов signed, unsigned, long и short -- Основные операторы: арифметические, логические, ... +- Еще раз про операторы: побитовые операторы - Кратко: что такое ссылки и указатели -# Операторы -- Присваивание -- Инкремент, декремент -- Арифметические операторы -- Логические операторы -- Порядок вычисления логических выражений (операндов && и ||) -- Сравнение -- Приоритет операторов - # ПРОЕКТ. Деление без деления - Алгоритм целочисленного деления без использования операций деления, умножения и получения остатка From c38d6bc1e0999b22c10309e71b9dd84244aeaae0 Mon Sep 17 00:00:00 2001 From: Microvenator Date: Mon, 27 Jan 2025 15:18:30 +0300 Subject: [PATCH 17/36] Update after chapter 2 merge --- cpp/contents.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index 2b89cad6..6466faf8 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -34,18 +34,21 @@ - C++ небезопасен - Области применения C++ -# Глава 2. Базовый синтаксис [IN PROGRESS] +# Глава 2. Базовый синтаксис [DONE] - Правила именования - Правила форматирования - Точка входа в программу - Функции - Переменные - Константы -- Несколько фундаментальных типов +- Знакомство с фундаментальными типами - Типы int и double - Тип bool - Тип char - Тип void +- Знакомство с библиотечными типами + - Тип std::size_t + - Класс std::string - Операторы - Операторы сравнения - Логические операторы @@ -54,10 +57,11 @@ - Инкремент и декремент - Приоритет операторов -# Управляющие конструкции -- Условия if-else -- Тернарный оператор -- Выбор через switch-case +# Глава 3. Управляющие конструкции [IN PROGRESS] +- Условное выполнение кода + - Условия if-else + - Тернарный оператор + - Конструкция switch-case - Циклы - Цикл while - Цикл do-while From 92e08efdcfe9011296b217afbaea1058e124df67 Mon Sep 17 00:00:00 2001 From: Microvenator Date: Mon, 27 Jan 2025 15:21:50 +0300 Subject: [PATCH 18/36] Chapter 4 update --- cpp/contents.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index 6466faf8..57d26120 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -68,9 +68,13 @@ - Цикл for # Переменные -- Несколько способов инициализации +- Инициализация переменных: щадящее знакомство + - Инициализация по умолчанию + - Копирующая инициализация + - Универсальная инициализация + - Статическая инициализация - Области видимости -- Время жизни локальных переменных +- Время жизни # Структура программы - Проекты до C++20 From ad74ff331309cc094ab8ac49d46b6d127b324193 Mon Sep 17 00:00:00 2001 From: Microvenator Date: Wed, 29 Jan 2025 12:08:34 +0300 Subject: [PATCH 19/36] Contents update after chapter 3 --- cpp/contents.md | 49 +++++++++++++++++++------------------------------ 1 file changed, 19 insertions(+), 30 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index 57d26120..a485cc25 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -67,14 +67,26 @@ - Цикл do-while - Цикл for +# ПРОЕКТ. Деление без деления +- Алгоритм целочисленного деления без использования операций деления, умножения и получения остатка + +# Экскурсия по C++ +- Как выглядят классы, +- ...enum, +- ...нэймспэйсы, +- ...шаблоны +- ...макросы +- ...исключения +- ...stl + # Переменные - Инициализация переменных: щадящее знакомство - Инициализация по умолчанию - Копирующая инициализация - Универсальная инициализация - Статическая инициализация -- Области видимости -- Время жизни +- Области видимости и время жизни + - Инициализаторы в условиях и циклах # Структура программы - Проекты до C++20 @@ -82,14 +94,6 @@ - Проекты после C++20: появление модулей - Импорт модулей -# Экскурсия по C++ -- Как выглядят классы, -- ...enum, -- ...нэймспэйсы, -- ...шаблоны -- ...макросы -- ...исключения - # Как собрать и запустить простой проект - Что такое компиляция - Компиляторы C++ @@ -98,25 +102,10 @@ # Типы данных - Классификация типов - что такое POD, фундаментальный тип, скалярный тип и тд -- Встроенные типы - int, char, ... и что с ними можно делать +- Встроенные типы и что с ними можно делать - Модификаторы типов signed, unsigned, long и short -- Еще раз про операторы: побитовые операторы -- Кратко: что такое ссылки и указатели - -# ПРОЕКТ. Деление без деления -- Алгоритм целочисленного деления без использования операций деления, умножения и получения остатка - -# Условия -- if -- Тернарный оператор -- switch-case -- Инициализаторы в if и switch-case - -# Циклы -- Варианты for -- while -- do-while -- continue, break +- Приведение типов +- Подводка к ссылкам и указателям # Ссылки - Мотивация @@ -166,7 +155,7 @@ - using # ПРОЕКТ. Утилита tree -- Консольная утилита для демонстрации иерархии директорий в виде дерева +- Консольная утилита для отображения иерархии директорий в виде дерева # Массивы - std::vector @@ -184,7 +173,7 @@ - Адаптер std::priority_queue # ПРОЕКТ. Скользящее среднее -- Алгоритм скользящего среднего в некоем окне +- Алгоритм скользящего среднего в заданном окне # Ассоциативные контейнеры - std::map From a2ebc134bb009fb4810b4750a8aeb655300773ad Mon Sep 17 00:00:00 2001 From: Microvenator Date: Thu, 30 Jan 2025 12:32:07 +0300 Subject: [PATCH 20/36] Pointers to functions, members --- cpp/contents.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cpp/contents.md b/cpp/contents.md index a485cc25..2a280ace 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -325,6 +325,8 @@ - Адресная арифметика - Массивы - Управление ресурсами, new/delete vs memalloc/free +- Указатели на функции +- Указатели на поля и методы классов - Идиома pimpl # Опасности при работе с указателями From 5759a09b87e19bec176139154c934b796f99b244 Mon Sep 17 00:00:00 2001 From: Microvenator Date: Tue, 11 Feb 2025 19:50:24 +0300 Subject: [PATCH 21/36] Course status update --- cpp/contents.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index 2a280ace..219e66d4 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -57,7 +57,7 @@ - Инкремент и декремент - Приоритет операторов -# Глава 3. Управляющие конструкции [IN PROGRESS] +# Глава 3. Управляющие конструкции [DONE] - Условное выполнение кода - Условия if-else - Тернарный оператор @@ -67,10 +67,10 @@ - Цикл do-while - Цикл for -# ПРОЕКТ. Деление без деления +# ПРОЕКТ. Деление без деления [DONE] - Алгоритм целочисленного деления без использования операций деления, умножения и получения остатка -# Экскурсия по C++ +# Экскурсия по C++ [IN PROGRESS] - Как выглядят классы, - ...enum, - ...нэймспэйсы, From b3ab964619a1b2f3ce62bc4cdc98932744b028fc Mon Sep 17 00:00:00 2001 From: Microvenator Date: Sat, 8 Mar 2025 11:59:31 +0300 Subject: [PATCH 22/36] Chapter 5 status update, chapter 6 swap --- cpp/contents.md | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index 219e66d4..e176afb3 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -70,14 +70,24 @@ # ПРОЕКТ. Деление без деления [DONE] - Алгоритм целочисленного деления без использования операций деления, умножения и получения остатка -# Экскурсия по C++ [IN PROGRESS] -- Как выглядят классы, -- ...enum, -- ...нэймспэйсы, -- ...шаблоны -- ...макросы -- ...исключения -- ...stl +# Глава 5. Экскурсия по C++ [IN PROGRESS] +- Перегрузка функций +- Исключения +- Пространства имен +- Перечисления enum +- Перечисления enum class +- Классы + - Конструкторы и деструкторы + - Идиома RAII +- Структуры +- Шаблоны + +# Обзор стандартных контейнеров и алгоритмов [IN PROGRESS] +- STL: контейнеры, итераторы, алгоритмы, функторы +- Классификация контейнеров: Sequential, Associative, Unordered associative и Adapters +- bitset и valarray +- Абстракция "Итератор" +- Что еще есть в стандартной библиотеке # Переменные - Инициализация переменных: щадящее знакомство @@ -133,13 +143,6 @@ - auto - RTTI: typeid, std::type_info -# Обзор стандартных контейнеров и алгоритмов -- STL: контейнеры, итераторы, алгоритмы, функторы -- Классификация контейнеров: Sequential, Associative, Unordered associative и Adapters -- bitset и valarray -- Абстракция "Итератор" -- Что еще есть в стандартной библиотеке - # Строки - std::string - std::wstring From 761dada513581e4e1d3c4eef914b2041e9eb95b4 Mon Sep 17 00:00:00 2001 From: Microvenator Date: Sat, 8 Mar 2025 12:09:46 +0300 Subject: [PATCH 23/36] Project after chapter 6 --- cpp/contents.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index e176afb3..7d4d9895 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -89,6 +89,9 @@ - Абстракция "Итератор" - Что еще есть в стандартной библиотеке +# ПРОЕКТ. Скользящее среднее +- Алгоритм скользящего среднего в заданном окне + # Переменные - Инициализация переменных: щадящее знакомство - Инициализация по умолчанию @@ -175,9 +178,6 @@ - Адаптер std::queue - Адаптер std::priority_queue -# ПРОЕКТ. Скользящее среднее -- Алгоритм скользящего среднего в заданном окне - # Ассоциативные контейнеры - std::map - std::set From f28206ce6db44419422913430eef16a3f3cfd854 Mon Sep 17 00:00:00 2001 From: Microvenator Date: Thu, 27 Mar 2025 11:40:54 +0300 Subject: [PATCH 24/36] Chapter 6 in progress --- cpp/contents.md | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index 7d4d9895..5b413a2d 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -70,7 +70,7 @@ # ПРОЕКТ. Деление без деления [DONE] - Алгоритм целочисленного деления без использования операций деления, умножения и получения остатка -# Глава 5. Экскурсия по C++ [IN PROGRESS] +# Глава 5. Экскурсия по C++ [DONE] - Перегрузка функций - Исключения - Пространства имен @@ -82,15 +82,29 @@ - Структуры - Шаблоны -# Обзор стандартных контейнеров и алгоритмов [IN PROGRESS] -- STL: контейнеры, итераторы, алгоритмы, функторы -- Классификация контейнеров: Sequential, Associative, Unordered associative и Adapters -- bitset и valarray -- Абстракция "Итератор" -- Что еще есть в стандартной библиотеке +# Глава 6. Итераторы [IN PROGRESS] +- Что такое итератор +- Реализация итераторов в C++ +- Основные действия над итераторами +- Константные итераторы +- Обратные итераторы +- Ключевое слово auto +- Инвалидация итераторов +- Строка — это контейнер? + +# Глава 7. Контейнеры [IN PROGRESS] +- Классификация контейнеров +- Последовательные контейнеры + - Статический массив std::array + - Динамический массив std::vector + - Двунаправленная очередь + - Списки +- Ассоциативные контейнеры +- Неупорядоченные ассоциативные контейнеры +- Адаптеры # ПРОЕКТ. Скользящее среднее -- Алгоритм скользящего среднего в заданном окне +- Класс для расчета скользящего среднего в заданном окне # Переменные - Инициализация переменных: щадящее знакомство @@ -113,6 +127,9 @@ - Компиляция в командной строке - Введение в CMake +# ПРОЕКТ. LRU-кэш +- Класс, реализующий стратегию кэширования least recently used + # Типы данных - Классификация типов - что такое POD, фундаментальный тип, скалярный тип и тд - Встроенные типы и что с ними можно делать @@ -146,11 +163,9 @@ - auto - RTTI: typeid, std::type_info -# Строки +# Строки, форматирование и ввод/вывод - std::string - std::wstring - -# Форматирование и ввод/вывод - Концепция стримов - std::format - std::print @@ -287,8 +302,7 @@ - Полная специализация шаблонов - Частичная специализация шаблонов (почему недоступна для функций) -# ПРОЕКТ. LRU-кэш -- Класс LRU-кэша, отнаследованный от базового абстрактного класса Cache +# ПРОЕКТ. TODO: подумать, какой проект здесь подойдет лучше --- Майлстоун. Вы умеете строить абстракции. Можно заводить пет-проект From 4d7134f8cbba333025dc7fe91c755541d8607f38 Mon Sep 17 00:00:00 2001 From: Microvenator Date: Wed, 30 Apr 2025 19:24:37 +0300 Subject: [PATCH 25/36] Update after release of chapter 7 --- cpp/contents.md | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index 5b413a2d..83557846 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -82,7 +82,7 @@ - Структуры - Шаблоны -# Глава 6. Итераторы [IN PROGRESS] +# Глава 6. Итераторы [DONE] - Что такое итератор - Реализация итераторов в C++ - Основные действия над итераторами @@ -92,20 +92,35 @@ - Инвалидация итераторов - Строка — это контейнер? -# Глава 7. Контейнеры [IN PROGRESS] +# Глава 7. Контейнеры [DONE] - Классификация контейнеров - Последовательные контейнеры - - Статический массив std::array - - Динамический массив std::vector - - Двунаправленная очередь - - Списки -- Ассоциативные контейнеры + - Класс vector + - Статический массив, дек и списки + - Алгоритмическая сложность работы с последовательными контейнерами +- Упорядоченные ассоциативные контейнеры + - Класс pair + - Класс map + - Класс set + - Классы multimap и multiset + - Алгоритмическая сложность работы с ассоциативными контейнерами - Неупорядоченные ассоциативные контейнеры + - Классы unordered_* контейнеров + - Алгоритмическая сложность работы с неупорядоченными ассоциативными контейнерами - Адаптеры + - Очереди и стек + - flat-версии ассоциативных контейнеров + - Алгоритмическая сложность работы с адаптерами -# ПРОЕКТ. Скользящее среднее +# ПРОЕКТ. Скользящее среднее [IN PROGRESS] - Класс для расчета скользящего среднего в заданном окне +# Алгоритмы [IN PROGRESS] +- Какие алгоритмы есть в стандартной библиотеке +- Поиск +- Сортировки +- Модификация последовательности элементов + # Переменные - Инициализация переменных: щадящее знакомство - Инициализация по умолчанию From 2450e9d8204999fb8cc26c59f628c14c5532c6f6 Mon Sep 17 00:00:00 2001 From: Microvenator Date: Sat, 3 May 2025 11:10:52 +0300 Subject: [PATCH 26/36] Containers & algos update --- cpp/contents.md | 55 +++++++++++-------------------------------------- 1 file changed, 12 insertions(+), 43 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index 83557846..d6c8ecb3 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -117,9 +117,15 @@ # Алгоритмы [IN PROGRESS] - Какие алгоритмы есть в стандартной библиотеке -- Поиск -- Сортировки -- Модификация последовательности элементов +- Поиск минимума/максимума: min, max, ... +- Бинарный поиск: binary_search, lower_bound, upper_bound, ... +- Сортировки: sort, is_sorted, ... +- Не модифицирующие алгоримы над последовательностями: all_if, any_of, find, ... +- Модифицирующие алгоритмы: copy, copy_if, transform, ... +- Деление на группы: partition, is_partition, ... +- Объединение: merge, set_union, ... +- Куча: push_heap, pop_heap, ... +- Параллельные алгоритмы # Переменные - Инициализация переменных: щадящее знакомство @@ -193,44 +199,6 @@ # ПРОЕКТ. Утилита tree - Консольная утилита для отображения иерархии директорий в виде дерева -# Массивы -- std::vector -- std::array -- Идиома erase-remove - -# Списки -- std::list -- std::forward_list - -# Очереди -- std::deque -- Адаптер std::stack -- Адаптер std::queue -- Адаптер std::priority_queue - -# Ассоциативные контейнеры -- std::map -- std::set -- std::multimap, std::multiset -- Адаптеры std::flat_map и std::flat_set, std::flat_multiset, std::flat_multimap - -# Неупорядоченные ассоциативные контейнеры -- std::unordered_map -- std::unordered_set -- std::unordered_multimap, std::unordered_multiset - -# Алгоритмы -- Не модифицирующие алгоримы над последовательностями: all_if, any_of, find, ... -- Модифицирующие алгоритмы: copy, copy_if, transform, ... -- Деление на группы: partition, is_partition, ... -- Сортировки: sort, is_sorted, ... -- Бинарный поиск: binary_search, lower_bound, upper_bound, ... -- Объединение: merge, set_union, ... -- Куча: push_heap, pop_heap, ... -- Поиск минимума/максимума: min, max, ... -- Параллельные алгоритмы -- Какие еще есть алгоритмы - # ПРОЕКТ. Калькулятор алгебраических выражений - Для строки с алгебраическим выражением, например, "81.0-(2.5+1)/3", вернуть его значение @@ -409,7 +377,7 @@ - std::error_code - variant types - std::optional - - std::exptected + - std::expected # Множественное наследование - Про множественное наследование. Ромбовидное наследование, проблемы @@ -454,6 +422,8 @@ - Union'ы и почему их не надо использовать - Альтернативы union'ам: std::variant, std::any +# Углубленное изучение контейнеров + # Обзор конкурентности в C++ - Потоки, thread_local - Процессы @@ -480,7 +450,6 @@ - ifndef, ... - Макросы и почему их лучше избегать - # ПРОЕКТ. Поисковый движок - Сервис с элементарным поисковым движком. Под капотом тред пул, разделяющий тяжелый объект From d32ae11f0301247501f7845637fb148aad146871 Mon Sep 17 00:00:00 2001 From: Microvenator Date: Tue, 20 May 2025 13:02:54 +0300 Subject: [PATCH 27/36] Update for chapter status --- cpp/contents.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/contents.md b/cpp/contents.md index d6c8ecb3..5d6c955c 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -112,7 +112,7 @@ - flat-версии ассоциативных контейнеров - Алгоритмическая сложность работы с адаптерами -# ПРОЕКТ. Скользящее среднее [IN PROGRESS] +# ПРОЕКТ. Скользящее среднее [DONE] - Класс для расчета скользящего среднего в заданном окне # Алгоритмы [IN PROGRESS] From 04e1d64af2751c473ea1e6c38ad6ec39f9130525 Mon Sep 17 00:00:00 2001 From: Microvenator Date: Tue, 3 Jun 2025 15:09:15 +0300 Subject: [PATCH 28/36] C++. Chapter 8 is ready --- cpp/contents.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index 5d6c955c..4ae7e443 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -115,19 +115,19 @@ # ПРОЕКТ. Скользящее среднее [DONE] - Класс для расчета скользящего среднего в заданном окне -# Алгоритмы [IN PROGRESS] +# Глава 8. Обзор алгоритмов [DONE] +- Мотивация применять алгоритмы - Какие алгоритмы есть в стандартной библиотеке -- Поиск минимума/максимума: min, max, ... -- Бинарный поиск: binary_search, lower_bound, upper_bound, ... -- Сортировки: sort, is_sorted, ... -- Не модифицирующие алгоримы над последовательностями: all_if, any_of, find, ... -- Модифицирующие алгоритмы: copy, copy_if, transform, ... -- Деление на группы: partition, is_partition, ... -- Объединение: merge, set_union, ... -- Куча: push_heap, pop_heap, ... -- Параллельные алгоритмы - -# Переменные +- Поиск +- Бинарный поиск +- Сортировка +- Копирование +- Удаление и идиома erase-remove +- Подсчет +- Когда использовать алгоритмы, а когда — методы класса? +- Оптимальны ли алгоритмы и контейнеры + +# Переменные [IN PROGRESS] - Инициализация переменных: щадящее знакомство - Инициализация по умолчанию - Копирующая инициализация From c8b353c1c6f76d658b344b99ee335696646bd1e2 Mon Sep 17 00:00:00 2001 From: Microvenator Date: Tue, 29 Jul 2025 19:40:21 +0300 Subject: [PATCH 29/36] Contents status update --- cpp/contents.md | 47 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 12 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index 4ae7e443..0de142ff 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -127,6 +127,41 @@ - Когда использовать алгоритмы, а когда — методы класса? - Оптимальны ли алгоритмы и контейнеры +# Глава 9. Время жизни и область видимости [DONE] +- Где живут переменные +- Время жизни +- Локальные переменные +- Глобальные переменные +- Статические переменные +- Затенение имен +- Вложенные блоки кода и RAII +- Инициализаторы в if и switch + +# ПРОЕКТ. Интерпретатор Brainfuck [DONE] +- Класс для выполнения кода на брейнфаке + +# Глава 10. Структура программы [DONE] +- Объявления и определения +- Проекты до появления модулей + - Структура проекта с хедерами и cpp-файлами + - Директивы препроцессора + - Подключение хедеров + - Недостатки использования хедеров +- Проекты с модулями + - Преимущества модулей + - Импорт модулей + - Структура простого модуля + - Подключение хедеров внутри модуля + - Сквозной импорт модулей + - Структура проекта с модулями + - Как соотносятся модули и пространства имен + +# Сборка программы [IN PROGRESS] +- Что такое компиляция +- Компиляторы C++ +- Компиляция в командной строке +- Введение в CMake + # Переменные [IN PROGRESS] - Инициализация переменных: щадящее знакомство - Инициализация по умолчанию @@ -136,18 +171,6 @@ - Области видимости и время жизни - Инициализаторы в условиях и циклах -# Структура программы -- Проекты до C++20 - - Подключение хедеров -- Проекты после C++20: появление модулей - - Импорт модулей - -# Как собрать и запустить простой проект -- Что такое компиляция -- Компиляторы C++ -- Компиляция в командной строке -- Введение в CMake - # ПРОЕКТ. LRU-кэш - Класс, реализующий стратегию кэширования least recently used From b8bbd8515e49778432e3e6a67ed0e9c2c847f439 Mon Sep 17 00:00:00 2001 From: Microvenator Date: Thu, 21 Aug 2025 18:32:01 +0300 Subject: [PATCH 30/36] Chapter 11 is ready --- cpp/contents.md | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index 0de142ff..96bad9b9 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -156,20 +156,34 @@ - Структура проекта с модулями - Как соотносятся модули и пространства имен -# Сборка программы [IN PROGRESS] -- Что такое компиляция +# Глава 11. Сборка программы [DONE] +- Компиляция - Компиляторы C++ -- Компиляция в командной строке -- Введение в CMake - -# Переменные [IN PROGRESS] -- Инициализация переменных: щадящее знакомство - - Инициализация по умолчанию - - Копирующая инициализация - - Универсальная инициализация - - Статическая инициализация -- Области видимости и время жизни - - Инициализаторы в условиях и циклах +- Пайплайн компиляции +- Препроцессинг +- Компиляция +- Ассемблирование +- Линковка + - Видимость символа для линкера + - Статическая и динамическая линковка +- C++ ABI +- Библиотеки +- Рантайм C++ +- Сборка проекта с модулями + - Модуль стандартной библиотеки + - Пользовательские модули +- Автоматизация сборки + +# Глава 12. Автоматизция сборки программы [IN PROGRESS] +- Make +- CMake +- Пакетные менеджеры + +# Инициализация переменных: щадящее знакомство [IN PROGRESS] +- Инициализация по умолчанию +- Копирующая инициализация +- Универсальная инициализация +- Статическая инициализация # ПРОЕКТ. LRU-кэш - Класс, реализующий стратегию кэширования least recently used From 2f6f15e5fb5e153bb089b65d6f95db836925253c Mon Sep 17 00:00:00 2001 From: Microvenator Date: Mon, 22 Sep 2025 14:22:42 +0300 Subject: [PATCH 31/36] Update after release of chapter 12 & practice --- cpp/contents.md | 55 +++++++++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index 96bad9b9..fab10ccf 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -174,20 +174,31 @@ - Пользовательские модули - Автоматизация сборки -# Глава 12. Автоматизция сборки программы [IN PROGRESS] -- Make -- CMake +# Глава 12. Автоматизция сборки программы [DONE] +- Что такое CMake +- Команды CMake +- Процесс сборки через CMake + - Сборка простого проекта с хедерами + - Сборка простого проекта с модулями +- Подпроекты +- Типы сборок +- Варианты установки переменных +- Вывод информации в консоль +- Работа с зависимостями + - Подключение библиотек, которые установлены в системе + - Подключение библиотек через модуль CMake +- Что использовать вместо CMake - Пакетные менеджеры -# Инициализация переменных: щадящее знакомство [IN PROGRESS] +# ПРОЕКТ. LRU кеш [DONE] +- Класс, реализующий стратегию кэширования least recently used + +# Глава 13. Щадящее введение в инициализацию [IN PROGRESS] - Инициализация по умолчанию - Копирующая инициализация - Универсальная инициализация - Статическая инициализация -# ПРОЕКТ. LRU-кэш -- Класс, реализующий стратегию кэширования least recently used - # Типы данных - Классификация типов - что такое POD, фундаментальный тип, скалярный тип и тд - Встроенные типы и что с ними можно делать @@ -207,6 +218,21 @@ - Перегрузка функций - inline +# Строки, форматирование и ввод/вывод +- std::string +- std::wstring +- Концепция стримов +- std::format +- std::print +- Файлы + +# ПРОЕКТ. Утилита tree +- Консольная утилита для отображения иерархии директорий в виде дерева + +# Алиасы +- typedef +- using + # Два вида "не делайте так" - Что такое UB - Undefined, unspecified, implementation-defined поведение: в чем разница @@ -221,21 +247,6 @@ - auto - RTTI: typeid, std::type_info -# Строки, форматирование и ввод/вывод -- std::string -- std::wstring -- Концепция стримов -- std::format -- std::print -- Файлы - -# Алиасы -- typedef -- using - -# ПРОЕКТ. Утилита tree -- Консольная утилита для отображения иерархии директорий в виде дерева - # ПРОЕКТ. Калькулятор алгебраических выражений - Для строки с алгебраическим выражением, например, "81.0-(2.5+1)/3", вернуть его значение From 284b3d749e338ca2c7cfc56dcf9a396d5fc674a0 Mon Sep 17 00:00:00 2001 From: Microvenator Date: Sat, 11 Oct 2025 13:20:53 +0300 Subject: [PATCH 32/36] C++. Chapter 13 is done --- cpp/contents.md | 114 ++++++++++++++++++++++++------------------------ 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index fab10ccf..b8c352e9 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -93,39 +93,52 @@ - Строка — это контейнер? # Глава 7. Контейнеры [DONE] -- Классификация контейнеров -- Последовательные контейнеры +- Глава 7.1. Какие бывают контейнеры + - Классификация контейнеров +- Глава 7.2. Последовательные контейнеры - Класс vector - - Статический массив, дек и списки - - Алгоритмическая сложность работы с последовательными контейнерами -- Упорядоченные ассоциативные контейнеры + - Класс array + - Класс deque + - Классы list и forward_list + - Резюме (алгоритмическая сложность) +- Глава 7.3. Упорядоченные ассоциативные контейнеры - Класс pair - Класс map - Класс set - Классы multimap и multiset - - Алгоритмическая сложность работы с ассоциативными контейнерами -- Неупорядоченные ассоциативные контейнеры - - Классы unordered_* контейнеров - - Алгоритмическая сложность работы с неупорядоченными ассоциативными контейнерами -- Адаптеры - - Очереди и стек + - Резюме (алгоритмическая сложность) +- Глава 7.4. Неупорядоченные ассоциативные контейнеры + - Класс unordered_set + - Класс unordered_map + - Классы unordered_multimap и unordered_multiset + - Резюме (алгоритмическая сложность) +- Глава 7.5. Адаптеры + - Класс queue + - Класс stack - flat-версии ассоциативных контейнеров - - Алгоритмическая сложность работы с адаптерами + - Резюме (алгоритмическая сложность) # ПРОЕКТ. Скользящее среднее [DONE] - Класс для расчета скользящего среднего в заданном окне # Глава 8. Обзор алгоритмов [DONE] -- Мотивация применять алгоритмы -- Какие алгоритмы есть в стандартной библиотеке -- Поиск -- Бинарный поиск -- Сортировка -- Копирование -- Удаление и идиома erase-remove -- Подсчет -- Когда использовать алгоритмы, а когда — методы класса? -- Оптимальны ли алгоритмы и контейнеры +- Глава 8.1. Немодифицирующие алгоритмы + - Мотивация применять алгоритмы + - Обзор алгоритмов стандартной библиотеки + - Поиск + - Бинарный поиск + - Подсчет +- Глава 8.2. Модифицирующие алгоритмы + - Сортировка + - Как реализована сортировка + - Компараторы + - Требования к компараторам + - Копирование + - Итераторы-адаптеры + - Удаление + - Идиома erase-remove + - Когда использовать алгоритмы, а когда — методы класса? + - Оптимальны ли алгоритмы и контейнеры # Глава 9. Время жизни и область видимости [DONE] - Где живут переменные @@ -193,13 +206,21 @@ # ПРОЕКТ. LRU кеш [DONE] - Класс, реализующий стратегию кэширования least recently used -# Глава 13. Щадящее введение в инициализацию [IN PROGRESS] -- Инициализация по умолчанию -- Копирующая инициализация -- Универсальная инициализация -- Статическая инициализация - -# Типы данных +# Глава 13. Щадящее введение в инициализацию [DONE] +- Глава 13.1. Основные способы инициализации + - Default-initialization: инициализация по умолчанию + - Copy-initialization: копирующая инициализация + - Неявное приведение типов + - Запрет неявного преобразования аргументов конструктора + - Direct-initialization: прямая инициализация + - The most vexing parse + - Uniform-initialization: универсальная инициализация +- Глава 13.2. Инициализация полей классов + - Default member initialization: прямая инициализация полей + - Member initializer list: список инициализации конструктора + - Designated-initialization: назначенная инициализация + +# Типы данных [IN PROGRESS] - Классификация типов - что такое POD, фундаментальный тип, скалярный тип и тд - Встроенные типы и что с ними можно делать - Модификаторы типов signed, unsigned, long и short @@ -253,16 +274,6 @@ --- Майлстоун. Вы знаете базовый синтаксис и умеете работать с контейнерами. Можно решать задачи на лееткоде и хакерранке -# Перечисления -- enum -- enum class - -# Исключения -- Синтаксис -- Как работает раскрутка стека -- Базовая гарантия исключений -- noexcept - # Классы: основы - Поля и методы - Спецификаторы доступа protected, public, private @@ -294,6 +305,12 @@ - Инкремент, декремент - Другие операторы: <<, ... +# Исключения +- Синтаксис +- Как работает раскрутка стека +- Базовая гарантия исключений +- noexcept + # ПРОЕКТ. Класс для представления числа в виде дроби - Класс для представления числа в виде дроби целых a/b. Перегрузить для него набор операторов @@ -346,7 +363,7 @@ - const_cast - reinterpret_cast -# Инициализация +# Инициализация: продолжение - Варианты инициализации - Most vexing parse - Списки инициализации @@ -397,23 +414,6 @@ - std::string_view - std::span, std::mdspan -# Сборка проекта: подробности -- Пайплайн компиляции - - Препроцессор - - Компилятор - - Ассемблер - - Линковщик -- C++ ABI -- Библиотеки - - Статические библиотеки - - Динамические библиотеки - - Header-only библиотеки -- Рантайм C++ -- Автоматизация сборки - - Make - - CMake - - Пакетные менеджеры - --- Майлстоун. Вы знаете важные концепции C++. Можно начинать собеситься на простые вакансии From 3db5cd69fde60e763a3f92d4ed5d44a3808bc449 Mon Sep 17 00:00:00 2001 From: "mesozoic.drones" Date: Wed, 24 Dec 2025 12:33:04 +0300 Subject: [PATCH 33/36] Chapter 15 is ready --- cpp/contents.md | 114 +++++++++++++++++++++++++++++------------------- 1 file changed, 69 insertions(+), 45 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index b8c352e9..958bf0b0 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -93,26 +93,26 @@ - Строка — это контейнер? # Глава 7. Контейнеры [DONE] -- Глава 7.1. Какие бывают контейнеры +- Глава 7.1. Какие бывают контейнеры [DONE] - Классификация контейнеров -- Глава 7.2. Последовательные контейнеры +- Глава 7.2. Последовательные контейнеры [DONE] - Класс vector - Класс array - Класс deque - Классы list и forward_list - Резюме (алгоритмическая сложность) -- Глава 7.3. Упорядоченные ассоциативные контейнеры +- Глава 7.3. Упорядоченные ассоциативные контейнеры [DONE] - Класс pair - Класс map - Класс set - Классы multimap и multiset - Резюме (алгоритмическая сложность) -- Глава 7.4. Неупорядоченные ассоциативные контейнеры +- Глава 7.4. Неупорядоченные ассоциативные контейнеры [DONE] - Класс unordered_set - Класс unordered_map - Классы unordered_multimap и unordered_multiset - Резюме (алгоритмическая сложность) -- Глава 7.5. Адаптеры +- Глава 7.5. Адаптеры [DONE] - Класс queue - Класс stack - flat-версии ассоциативных контейнеров @@ -122,13 +122,13 @@ - Класс для расчета скользящего среднего в заданном окне # Глава 8. Обзор алгоритмов [DONE] -- Глава 8.1. Немодифицирующие алгоритмы +- Глава 8.1. Немодифицирующие алгоритмы [DONE] - Мотивация применять алгоритмы - Обзор алгоритмов стандартной библиотеки - Поиск - Бинарный поиск - Подсчет -- Глава 8.2. Модифицирующие алгоритмы +- Глава 8.2. Модифицирующие алгоритмы [DONE] - Сортировка - Как реализована сортировка - Компараторы @@ -207,7 +207,7 @@ - Класс, реализующий стратегию кэширования least recently used # Глава 13. Щадящее введение в инициализацию [DONE] -- Глава 13.1. Основные способы инициализации +- Глава 13.1. Основные способы инициализации [DONE] - Default-initialization: инициализация по умолчанию - Copy-initialization: копирующая инициализация - Неявное приведение типов @@ -215,22 +215,72 @@ - Direct-initialization: прямая инициализация - The most vexing parse - Uniform-initialization: универсальная инициализация -- Глава 13.2. Инициализация полей классов +- Глава 13.2. Инициализация полей классов [DONE] - Default member initialization: прямая инициализация полей - Member initializer list: список инициализации конструктора - Designated-initialization: назначенная инициализация -# Типы данных [IN PROGRESS] -- Классификация типов - что такое POD, фундаментальный тип, скалярный тип и тд -- Встроенные типы и что с ними можно делать -- Модификаторы типов signed, unsigned, long и short -- Приведение типов -- Подводка к ссылкам и указателям +# Глава 14. Типы [DONE] +- Глава 14.1. Фундаментальные типы [DONE] + - Целые числа на базе int + - Целочисленное переполнение + - Целые числа в разных системах счисления + - Символьные типы + - Типы вещественных чисел + - Специфика представления чисел с плавающей точкой + - Бесконечность и нечисло + - Сравнение вещественных чисел + - Псевдонимы типов + - Ключевые слова typedef и using + - Целочисленные типы фиксированной ширины + - Тип size_t + - Суффиксы литералов + - Какой тип выбрать? +- Глава 14.2. Составные типы [DONE] + - Перечисления + - Функции + - Сигнатура функции + - Тип функции + - Классы и структуры + - Массивы + - Длина массива + - Многомерные массивы + - Недостатки массивов + - Советы по работе с массивами + - Ссылки и указатели + +# Глава 15. Ссылки [DONE] +- Что такое ссылка +- Работа со ссылками +- Передача параметров в функцию по ссылке +- Использование ссылок в цикле range-for +- Ссылки и константность +- Возврат значения по ссылке +- Когда нужно и не нужно использовать ссылки +- Нюансы при работе со ссылками + - Ссылки на ссылки + - Продление времени жизни временных объектов + +# ПРОЕКТ. Калькулятор алгебраических выражений [IN PROGRESS] +- Для строки с алгебраическим выражением, например, "81.0-(2.5+1)/3", вернуть его значение -# Ссылки -- Мотивация -- Синтаксис -- Продление жизни временных объектов +--- +Майлстоун. Вы знаете базовый синтаксис и умеете работать с контейнерами. Можно решать задачи на лееткоде и хакерранке + +# Указатели [IN PROGRESS] +- Концепция указателя +- nullptr +- Адресная арифметика +- Массивы +- Управление ресурсами, new/delete vs memalloc/free +- Указатели на функции +- Указатели на поля и методы классов +- Идиома pimpl +- Утечки памяти + - Освобождение ресурсов в Си-стиле: goto +- Двойное освобождение +- Выход за границы +- Необходимость в RAII и умных указателях # Функции - Способы передачи аргументов @@ -250,10 +300,6 @@ # ПРОЕКТ. Утилита tree - Консольная утилита для отображения иерархии директорий в виде дерева -# Алиасы -- typedef -- using - # Два вида "не делайте так" - Что такое UB - Undefined, unspecified, implementation-defined поведение: в чем разница @@ -268,11 +314,6 @@ - auto - RTTI: typeid, std::type_info -# ПРОЕКТ. Калькулятор алгебраических выражений -- Для строки с алгебраическим выражением, например, "81.0-(2.5+1)/3", вернуть его значение - ---- -Майлстоун. Вы знаете базовый синтаксис и умеете работать с контейнерами. Можно решать задачи на лееткоде и хакерранке # Классы: основы - Поля и методы @@ -384,23 +425,6 @@ - Стэк, хип, статическая память - volatile, static -# Указатели -- Концепция указателя -- nullptr -- Адресная арифметика -- Массивы -- Управление ресурсами, new/delete vs memalloc/free -- Указатели на функции -- Указатели на поля и методы классов -- Идиома pimpl - -# Опасности при работе с указателями -- Утечки памяти - - Освобождение ресурсов в Си-стиле: goto -- Двойное освобождение -- Выход за границы -- Необходимость в RAII и умных указателях - # ПРОЕКТ. Свой класс Строка - Класс Строка с ограниченным набором методов From aa04a073cf936f93be9e11a40868962b4eb7b71f Mon Sep 17 00:00:00 2001 From: "mesozoic.drones" Date: Thu, 1 Jan 2026 15:27:29 +0300 Subject: [PATCH 34/36] Practice 5 is DONE --- cpp/contents.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/contents.md b/cpp/contents.md index 958bf0b0..4db50c13 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -261,7 +261,7 @@ - Ссылки на ссылки - Продление времени жизни временных объектов -# ПРОЕКТ. Калькулятор алгебраических выражений [IN PROGRESS] +# ПРОЕКТ. Калькулятор алгебраических выражений [DONE] - Для строки с алгебраическим выражением, например, "81.0-(2.5+1)/3", вернуть его значение --- From 62f25d6f1677fc98fc7d86391895f9ca077a0dda Mon Sep 17 00:00:00 2001 From: "mesozoic.drones" Date: Sun, 25 Jan 2026 08:47:47 +0300 Subject: [PATCH 35/36] Chapter 16 in progress. CTAD in chapter about templates --- cpp/contents.md | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index 4db50c13..75461a57 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -267,20 +267,23 @@ --- Майлстоун. Вы знаете базовый синтаксис и умеете работать с контейнерами. Можно решать задачи на лееткоде и хакерранке -# Указатели [IN PROGRESS] -- Концепция указателя -- nullptr -- Адресная арифметика -- Массивы -- Управление ресурсами, new/delete vs memalloc/free -- Указатели на функции -- Указатели на поля и методы классов -- Идиома pimpl -- Утечки памяти - - Освобождение ресурсов в Си-стиле: goto -- Двойное освобождение -- Выход за границы -- Необходимость в RAII и умных указателях +# Глава 16. Указатели [IN PROGRESS] +- Глава 16.1. Основы работы с указателями [DONE] + - Что такое указатель + - Объявление указателя + - Оператор взятия адреса + - Как вывести в консоль адрес объекта + - Оператор разыменования + - Размер указателя + - Нулевой указатель + - Оператор доступа к полям и методам класса + - Указатели и рекурсивные структуры данных + - Передача параметров по указателю + - Низведение массива (array to pointer decay) + - Указатели и константность + - Когда использовать указатели, а когда — ссылки +- Глава 16.2. Адресная арифметика [IN PROGRESS] +- Глава 16.3. Динамическое выделение памяти [IN PROGRESS] # Функции - Способы передачи аргументов @@ -383,6 +386,7 @@ # Шаблоны и статический полиморфизм - Синтаксис объявления шаблонов - Как работает инстанцирование шаблонов +- CTAD - decltype - SFINAE - Перегрузка функций vs шаблонные функции From 543a7c8630a80d7be60f2ce8294e92ca75c73641 Mon Sep 17 00:00:00 2001 From: mesozoic-drones Date: Thu, 19 Feb 2026 16:25:25 +0300 Subject: [PATCH 36/36] Split chapters to subchapters --- cpp/contents.md | 283 +++++++++++++++++++++++++++--------------------- 1 file changed, 161 insertions(+), 122 deletions(-) diff --git a/cpp/contents.md b/cpp/contents.md index 75461a57..85f31858 100644 --- a/cpp/contents.md +++ b/cpp/contents.md @@ -15,108 +15,138 @@ - Куда сообщать об ошибках? # Глава 1. Что такое C++ [DONE] -- Философия С++ - - Свобода выбора - - Обратная совместимость - - Эффективность -- Что делает язык C++ языком C++ - - Слабая статическая типизация - - ООП - - Метапрограммирование -- Развитие языка -- Экосистема вокруг языка - - Сборка - - IDE и редакторы - - Библиотеки и фреймворки - - Линтеры, форматтеры и статические анализаторы кода -- Мифы о C++ - - Мифический язык C/C++ - - C++ небезопасен -- Области применения C++ +- Глава 1.1. Что такое C++ [DONE] + - Философия С++ + - Свобода выбора + - Обратная совместимость + - Эффективность + - Что делает язык C++ языком C++ + - Слабая статическая типизация + - ООП + - Метапрограммирование + - Развитие языка +- Глава 1.2. Всё, что вокруг [DONE] + - Экосистема + - Сборка + - IDE и редакторы + - Библиотеки и фреймворки + - Линтеры, форматтеры и статические анализаторы кода + - Мифы о C++ + - Мифический язык C/C++ + - C++ небезопасен + - Области применения C++ # Глава 2. Базовый синтаксис [DONE] -- Правила именования -- Правила форматирования -- Точка входа в программу -- Функции -- Переменные -- Константы -- Знакомство с фундаментальными типами - - Типы int и double - - Тип bool - - Тип char - - Тип void -- Знакомство с библиотечными типами - - Тип std::size_t - - Класс std::string -- Операторы +- Глава 2.1. Переменные и функции [DONE] + - Правила именования + - Правила форматирования + - Точка входа в программу + - Функции + - Переменные + - Константы + - Знакомство с фундаментальными типами + - Типы int и double + - Тип bool + - Тип char + - Тип void + - Знакомство с библиотечными типами + - Тип std::size_t + - Класс std::string +- Глава 2.2. Операторы [DONE] - Операторы сравнения - Логические операторы - Арифметические операторы - Составное присваивание + - Возвращаемое значение и побочные эффекты - Инкремент и декремент - - Приоритет операторов + - Приоритет и ассоциативность операторов -# Глава 3. Управляющие конструкции [DONE] -- Условное выполнение кода +# Глава 3. Условия [DONE] +- Глава 3.1. Условия if-else и тернарный оператор [DONE] - Условия if-else + - Когда фигурные скобки обязательны, а когда - опциональны? + - Вложенные условия - Тернарный оператор - - Конструкция switch-case -- Циклы +- Глава 3.2. Конструкция switch-case [DONE] + - Как выглядит switch-case + - Оператор break + +# Глава 4. Циклы [DONE] +- Глава 4.1. Циклы while и do-while [DONE] - Цикл while - Цикл do-while +- Глава 4.2. Циклы for и range-for [DONE] - Цикл for + - Цикл range-for # ПРОЕКТ. Деление без деления [DONE] - Алгоритм целочисленного деления без использования операций деления, умножения и получения остатка # Глава 5. Экскурсия по C++ [DONE] -- Перегрузка функций -- Исключения -- Пространства имен -- Перечисления enum -- Перечисления enum class -- Классы - - Конструкторы и деструкторы - - Идиома RAII -- Структуры -- Шаблоны +- Глава 5.1. Перегрузка функций [DONE] + - Что такое перегрузка + - Зачем нужна перегрузка +- Глава 5.2. Исключения [DONE] + - Как работают исключения + - Оператор throw + - Конструкция try-catch +- Глава 5.3. Пространства имён [DONE] + - Объявление пространства имен + - Доступ к пространству имен + - Для чего нужны пространства имен + - Вложенные пространства имен +- Глава 5.4. Перечисления [DONE] + - Перечисления enum + - Перечисления enum class +- Глава 5.5. Классы и структуры [DONE] + - Классы + - Конструкторы и деструкторы + - Идиома RAII + - Структуры +- Глава 5.6. Шаблоны [DONE] + - Шаблоны функций + - Инстанцирование шаблонов # Глава 6. Итераторы [DONE] -- Что такое итератор -- Реализация итераторов в C++ -- Основные действия над итераторами -- Константные итераторы -- Обратные итераторы -- Ключевое слово auto -- Инвалидация итераторов -- Строка — это контейнер? +- Глава 6.1. Что такое итератор [DONE] + - STL + - Концепция итератора + - Реализация итераторов в C++ + - Основные действия над итераторами + - Категории итераторов +- Глава 6.2. Работа с итераторами [DONE] + - Константные итераторы + - Обратные итераторы + - Ключевое слово auto + - Инвалидация итераторов + # Глава 7. Контейнеры [DONE] - Глава 7.1. Какие бывают контейнеры [DONE] - Классификация контейнеров + - Строка - это контейнер? + - Другие классы, которые похожи на контейнеры - Глава 7.2. Последовательные контейнеры [DONE] - Класс vector - Класс array + - Абстрактные типы данных и структуры данных - Класс deque - Классы list и forward_list - - Резюме (алгоритмическая сложность) - Глава 7.3. Упорядоченные ассоциативные контейнеры [DONE] - Класс pair - Класс map - Класс set - Классы multimap и multiset - - Резюме (алгоритмическая сложность) - Глава 7.4. Неупорядоченные ассоциативные контейнеры [DONE] - Класс unordered_set - Класс unordered_map - Классы unordered_multimap и unordered_multiset - - Резюме (алгоритмическая сложность) - Глава 7.5. Адаптеры [DONE] - Класс queue + - Класс priority_queue - Класс stack - flat-версии ассоциативных контейнеров - - Резюме (алгоритмическая сложность) + - Алгоритмическая сложность работы с адаптерами # ПРОЕКТ. Скользящее среднее [DONE] - Класс для расчета скользящего среднего в заданном окне @@ -141,26 +171,33 @@ - Оптимальны ли алгоритмы и контейнеры # Глава 9. Время жизни и область видимости [DONE] -- Где живут переменные -- Время жизни -- Локальные переменные -- Глобальные переменные -- Статические переменные -- Затенение имен -- Вложенные блоки кода и RAII -- Инициализаторы в if и switch +- Глава 9.1. Жизненный цикл переменной [DONE] + - Где живут переменные + - Время жизни + - Локальные переменные + - Глобальные переменные + - Статические переменные +- Глава 9.2. Приёмы, связанные с областью видимости [DONE] + - Затенение имен + - Вложенные блоки кода и RAII + - Инициализаторы в if и switch # ПРОЕКТ. Интерпретатор Brainfuck [DONE] - Класс для выполнения кода на брейнфаке # Глава 10. Структура программы [DONE] -- Объявления и определения -- Проекты до появления модулей - - Структура проекта с хедерами и cpp-файлами +- Глава 10.1. Объявления и определения [DONE] + - Видимость объявлений для компилятора + - Что такое объявление и определение + - Правило одного определения + - Объявление и определение класса +- Глава 10.2. Хедеры [DONE] + - Простой проект с хедерами + - Правила организации проекта с хедерами - Директивы препроцессора - Подключение хедеров - Недостатки использования хедеров -- Проекты с модулями +- Глава 10.2. Модули [DONE] - Преимущества модулей - Импорт модулей - Структура простого модуля @@ -170,44 +207,44 @@ - Как соотносятся модули и пространства имен # Глава 11. Сборка программы [DONE] -- Компиляция -- Компиляторы C++ -- Пайплайн компиляции -- Препроцессинг -- Компиляция -- Ассемблирование -- Линковка +- Глава 11.1. Этапы сборки [DONE] + - Компиляция проекта + - Компиляторы C++ + - Пайплайн компиляции + - Препроцессинг + - Компиляция + - Ассемблирование + - Линковка +- Глава 11.2. Подключение библиотек и модулей [DONE] - Видимость символа для линкера - Статическая и динамическая линковка -- C++ ABI -- Библиотеки -- Рантайм C++ -- Сборка проекта с модулями - - Модуль стандартной библиотеки - - Пользовательские модули -- Автоматизация сборки - -# Глава 12. Автоматизция сборки программы [DONE] -- Что такое CMake -- Команды CMake -- Процесс сборки через CMake - - Сборка простого проекта с хедерами - - Сборка простого проекта с модулями -- Подпроекты -- Типы сборок -- Варианты установки переменных -- Вывод информации в консоль -- Работа с зависимостями - - Подключение библиотек, которые установлены в системе - - Подключение библиотек через модуль CMake -- Что использовать вместо CMake -- Пакетные менеджеры + - C++ ABI + - Библиотеки + - Рантайм C++ + - Сборка проекта с модулями + - Модуль стандартной библиотеки + - Пользовательские модули +- Глава 11.3. Автоматизация сборки программы [DONE] + - Что такое CMake + - Команды CMake + - Процесс сборки через CMake + - Сборка простого проекта с хедерами + - Сборка простого проекта с модулями + - Подпроекты + - Типы сборок + - Варианты установки переменных + - Вывод информации в консоль + - Работа с зависимостями + - Подключение библиотек, которые установлены в системе + - Подключение библиотек через модуль CMake + - Что использовать вместо CMake + - Пакетные менеджеры # ПРОЕКТ. LRU кеш [DONE] - Класс, реализующий стратегию кэширования least recently used -# Глава 13. Щадящее введение в инициализацию [DONE] -- Глава 13.1. Основные способы инициализации [DONE] +# Глава 12. Щадящее введение в инициализацию [DONE] +- Глава 12.1. Основные способы инициализации [DONE] - Default-initialization: инициализация по умолчанию - Copy-initialization: копирующая инициализация - Неявное приведение типов @@ -215,13 +252,13 @@ - Direct-initialization: прямая инициализация - The most vexing parse - Uniform-initialization: универсальная инициализация -- Глава 13.2. Инициализация полей классов [DONE] +- Глава 12.2. Инициализация полей классов [DONE] - Default member initialization: прямая инициализация полей - Member initializer list: список инициализации конструктора - Designated-initialization: назначенная инициализация -# Глава 14. Типы [DONE] -- Глава 14.1. Фундаментальные типы [DONE] +# Глава 13. Типы [DONE] +- Глава 13.1. Фундаментальные типы [DONE] - Целые числа на базе int - Целочисленное переполнение - Целые числа в разных системах счисления @@ -236,7 +273,7 @@ - Тип size_t - Суффиксы литералов - Какой тип выбрать? -- Глава 14.2. Составные типы [DONE] +- Глава 13.2. Составные типы [DONE] - Перечисления - Функции - Сигнатура функции @@ -249,17 +286,19 @@ - Советы по работе с массивами - Ссылки и указатели -# Глава 15. Ссылки [DONE] -- Что такое ссылка -- Работа со ссылками -- Передача параметров в функцию по ссылке -- Использование ссылок в цикле range-for -- Ссылки и константность -- Возврат значения по ссылке -- Когда нужно и не нужно использовать ссылки -- Нюансы при работе со ссылками - - Ссылки на ссылки +# Глава 14. Ссылки [DONE] +- Глава 14.1. Ссылки: знакомство [DONE] + - Что такое ссылка + - Работа со ссылками + - Передача параметров в функцию по ссылке + - Использование ссылок в цикле range-for + - Ссылки и константность +- Глава 14.2. Нюансы работы со ссылками [DONE] + - Возврат значения по ссылке + - Висячие ссылки - Продление времени жизни временных объектов + - Ссылки на ссылки + - Когда нужно и не нужно использовать ссылки # ПРОЕКТ. Калькулятор алгебраических выражений [DONE] - Для строки с алгебраическим выражением, например, "81.0-(2.5+1)/3", вернуть его значение @@ -267,8 +306,8 @@ --- Майлстоун. Вы знаете базовый синтаксис и умеете работать с контейнерами. Можно решать задачи на лееткоде и хакерранке -# Глава 16. Указатели [IN PROGRESS] -- Глава 16.1. Основы работы с указателями [DONE] +# Глава 15. Указатели [IN PROGRESS] +- Глава 15.1. Основы работы с указателями [DONE] - Что такое указатель - Объявление указателя - Оператор взятия адреса @@ -282,8 +321,8 @@ - Низведение массива (array to pointer decay) - Указатели и константность - Когда использовать указатели, а когда — ссылки -- Глава 16.2. Адресная арифметика [IN PROGRESS] -- Глава 16.3. Динамическое выделение памяти [IN PROGRESS] +- Глава 15.2. Адресная арифметика [IN PROGRESS] +- Глава 15.3. Динамическое выделение памяти [IN PROGRESS] # Функции - Способы передачи аргументов