Skip to content

Instantly share code, notes, and snippets.

@BigRedEye
Created February 15, 2026 13:07
Show Gist options
  • Select an option

  • Save BigRedEye/86ba0482802462b7fa7547887936636c to your computer and use it in GitHub Desktop.

Select an option

Save BigRedEye/86ba0482802462b7fa7547887936636c to your computer and use it in GitHub Desktop.
share_link share_updated
2026-01-11 17:14:33 +0300

Первый курс (21 пара)

Таймлайн

   Январь 2026       Февраль 2026      Март 2026         
пн     5 12 19 26        2  9 16 23        2  9 16 23 30
вт     6[13]20]27]      [3]10]17]24]      [3]10]17]24]31
ср     7 14 21 28        4 11 18 25        4 11 18 25   
чт  1  8 15 22 29        5 12 19 26        5 12 19 26   
пт  2  9[16]23]30]      [6]13]20]27]       6 13 20 27   
сб  3 10 17 24 31        7 14 21 28       [7]14]21]28  
вс  4 11 18 25        1  8 15 22        1  8 15 22 29  
 
      6 лекций          14 = +8 лекций     21 = +7 лекций
    1  2  3  4  5     5  6  7  8  9     9 10 11 12 13 14

Что нужно сделать

  1. Зарегистрироваться на gitlab.cpp-hse.net. Можно использовать почту на hse.ru / edu.hse.ru, или же ввести example@hse.ru и пингануть в чатике t.me/BigRedEye, чтоб окнуть руками.
  2. Найти своего ассистента(ов), списаться с ним.
  3. Завести чатик в Telegram для своей группы, на первом занятии скинуть ссылку студентам
  4. Коммуникация со студентами со стороны лектора живет в канале t.me/hse_cxx_2026 и чате https://t.me/+CycvNg7gX_A2ZGYy. Наверное, полезно вступить как минимум в канал. В чате обычно много флуда, это техническая поддержка.
  5. Посмотреть на проект (archiver) на https://gitlab.com/hse-cpp/hse-base-cpp/-/tree/main/tasks/archiver?ref_type=heads. В идеале написать и сдать, но как минимум продумать архитектуру. Тут, наверное, может помочь Богдан или Сергей?
  6. Проголосовать про удобное время еженедельной встречки: https://www.when2meet.com/?34282610-jiEWo

Коды доступа

  • name: 254-1 secret: ami-cpp-254-1
  • name: 254-2 secret: ami-cpp-254-2
  • name: 255-1 secret: ami-cpp-255-1
  • name: 255-2 secret: ami-cpp-255-2
  • name: 257-1 secret: ami-cpp-257-1
  • name: 257-2 secret: ami-cpp-257-2
  • name: 258-1 secret: ami-cpp-258-1
  • name: 258-2 secret: ami-cpp-258-2
  • name: 259-1 secret: ami-cpp-259-1
  • name: 259-2 secret: ami-cpp-259-2
  • name: 2510-1 secret: ami-cpp-2510-1
  • name: 2510-2 secret: ami-cpp-2510-2
  • name: 2511-1 secret: ami-cpp-2511-1
  • name: 2511-2 secret: ami-cpp-2511-2
  • name: 2512-1 secret: ami-cpp-2512-1
  • name: 2512-2 secret: ami-cpp-2512-2
  • name: 2513-1 secret: ami-cpp-2513-1
  • name: 2513-2 secret: ami-cpp-2513-2
  • name: 2514-1 secret: ami-cpp-2514-1
  • name: 2514-2 secret: ami-cpp-2514-2
  • name: 2515-1 secret: ami-cpp-2515-1

AI

  • Выдаем проект после 10 лекции (13.02). Дедлайн – 14.03, ещё неделя на защиты
  • Обмениваться банком задач по семинарам
  • Голосовалка про еженедельную встречу на 15 минут

Оценивание

  • 0.275 ДЗ + 0.1 Семинары + 0.625 Проект
    • Проект надо защитить.
    • Домашки защищаются ассистентами.

Неделя 1

Лекция 1: введение в курс, настройка окружения, история языка

  • Общая информация о курсе
  • Цели и философия курса
  • Правила оценивания
  • Репозитории и система сдачи заданий
  • Базовое использование IDE
  • Краткий обзор инструментов: компилятор (g++/clang), система сборки (CMake), IDE (VS Code/CLion), Git.
  • cppreference.com как основной источник документации.
  • Общая структура проекта (исходники, тесты, система сборки).

Семинар 1: Настройка среды окружения

  • Настраиваем окружение:
    • IDE: Clion бесплатный, VSCode
    • Как запускать тесты (cmake)
    • Как форматировать (clang-format)
    • Как линтить (clang-tidy)
    • Git (как сдавать?)
    • Дебаггер (как чинить тесты?). gdb в консольке или визуальный в редакторе, как удобнее
  • Definition of done: сдана первая задача (multiplication).

Неделя 2

Лекция 2: разбор первых программ на C++

  • Простейшая программа на C++
  • Компиляция в командной строке
  • Функция main
  • Консольный ввод-вывод
  • Объявление и инициализация переменных
  • Базовые элементы синтаксиса
    • {}
    • if, else
    • for
    • while, do ... while
    • continue, break
    • switch ... case

Семинар 2: заканчиваем с настройкой окружения

Неделя 3

Лекция 3: Примитивные типы, переполнение, UB

  • Целочисленные типы (int, long long и др.), знаковые/беззнаковые, гарантии на их размеры.
  • Операторы
    • Арифметические; префиксный и постфиксные версии ++ и ``
    • %
    • << >>
    • &&, ||, &, |, ^
    • ... ? ... : ...
  • Неопределенное поведение (UB) и его источники (переполнение знаковых типов, неинициализированные переменные).
  • Числа с плавающей запятой (float, double), проблемы с точностью.
  • Ключевое слово auto для вывода типов. std::numeric_limits.
  • Есть std::string, в ней храним строчки, подробнее потом.

Семинар 3:

  • UB: примеры проблем с ним, нельзя допускать ни в коем случае
  • Как жить с UB? ASan, UBSan
  • Поговорить про float
  • Задачи на битовые операции

Неделя 4

Лекция 4: Функции. Ссылки, const&, перегрузка.

  • Объявление и определение функций, forward declaration.
  • Ссылки. Передача аргументов по ссылке, по константной ссылке.
  • Константность (const) как контракт.
  • Перегрузка функций.

Семинар 4

  • Рекурсия
  • Выходные параметры

Неделя 5

Лекция 5: Указатели. Массивы

  • C-style массивы
  • C-style строки
  • Пробуем range based for
  • Указатели. Пробуем передать массив в функцию, все ломается.

Неделя 6

Лекция 6: Структуры и классы: поля, методы, конструкторы.

  • struct vs class. Поля и методы.
  • Конструкторы (включая explicit), списки инициализации, деструкторы.
  • Методы, this
  • Модификаторы доступа: public, private, protected.

Семинар 6

  • Пишем класс, например, Rational (инварианты, explicit)
  • Можно дать перегрузку операторов

Неделя 7

Лекция 7: std::vector и std::string.

  • std::vector как динамический массив: push_back, size, capacity, доступ по индексу.
  • std::string как контейнер для текста, основные операции.
  • Введение в std::string_view как невладеющий аналог строки для производительности.

Семинар 7: Производительность строк (std::string_view).

  • Зачем нужна std::string_view
  • Как устроена std::string? Можно рассказать байку про SSO и 23 байта в libc++

Неделя 8

Лекция 8: Итераторы, range-based for, алгоритмы STL.

  • Концепция итератора как "обобщенного указателя". begin(), end().
  • Range-based for как синтаксический сахар над итераторами.
  • Обзор ключевых алгоритмов: std::sort, std::find, std::count_if, std::copy, std::accumulate.

Семинар 8:

  • Решаем задачи на алгоритмы
  • Пишем алгоритмы

Неделя 9

Лекция 9: Ассоциативные контейнеры и адаптеры.

  • Контейнеры на основе деревьев: std::map, std::set.
  • Контейнеры на основе хеш-таблиц: std::unordered_map, std::unordered_set.
  • Контейнеры-адаптеры: std::stack, std::queue, std::priority_queue.

Семинар 9: Выдаем проект

  • Рассказываем свои требования, рассказываем, как будем оценивать и проверять.
  • Останется время – обсуждаем устройство хеш-таблиц.

Неделя 10

Лекция 10: Шаблоны функций и классов.

  • Мотивация: DRY (Don't Repeat Yourself).
  • Шаблоны функций: синтаксис, инстанцирование.
  • Шаблоны классов: синтаксис, non-type template parameters.

Семинар 10:

  • Примеры шаблонных классов
  • FixedVector<T, Capacity>.

Неделя 11

Лекция 11: Управление памятью: стек, куча, сырые указатели.

  • Виды памяти: статическая, автоматическая (стек), динамическая (куча).
  • Операторы new/delete и new[]/delete[]. Утечки памяти.
  • Сырые указатели, арифметика указателей, связь с массивами.

Семинар 11:

  • Заново проговариваем мотивацию динамической памяти
  • Пишем умные указатили?

Неделя 12

Лекция 12: RAII и умные указатели (unique_ptr, shared_ptr).

  • Идиома RAII (Resource Acquisition Is Initialization) как основа безопасности C++.
  • std::unique_ptr: семантика уникального владения.
  • std::shared_ptr: семантика разделяемого владения, счетчик ссылок.
  • std::weak_ptr для разрыва циклических зависимостей.

Семинар 12:

  • Пишем умный указатель (UniquePtr)
  • Остается время – примеры сложных ресурсов c RAII (файлы?)
  • RAII: Деструкторы не панацея, могут не вызываться при абнормальном завершении программы (даже std::terminate)

Неделя 13

Лекция 13: Правило трёх: конструктор копирования, оператор присваивания, деструктор.

  • Проблема shallow copy для классов с ресурсами.
  • Детальный разбор конструктора копирования и оператора присваивания.
  • Объединение всех трёх функций в "Правило трёх".

Семинар 13: Идиома Copy-and-Swap.

Неделя 14

Лекция 14: Move-семантика, rvalue-ссылки, Правило пяти.

  • lvalue vs rvalue. Ссылки на rvalue (&&).
  • Семантика перемещения как "кража" ресурса у временного объекта.
  • std::move как безусловное приведение к rvalue-ссылке.
  • Конструктор перемещения и оператор присваивания перемещением. Правило пяти/шести.

Семинар 14:

  • Добавляем перемещение умному указателю
  • Примеры классов с перемещением

Неделя 15

Лекция 15: Наследование и виртуальный полиморфизм.

  • Идея наследования. public, protected, private наследование.
  • Проблема "срезки" (slicing).
  • Виртуальные функции, override, таблица виртуальных функций (vtable).
  • Абстрактные классы и чисто виртуальные функции. Виртуальный деструктор.

Семинар 15: Динамический полиморфизм.

Неделя 16

Лекция 16: Обработка ошибок через исключения.

  • Синтаксис try, catch, throw.
  • Иерархия std::exception. Пользовательские исключения.
  • Раскрутка стека (stack unwinding) и важность RAII.
  • noexcept и гарантии безопасности исключений (базовая, сильная, nothrow).

Семинар 16: Гарантии безопасности исключений.

Неделя 17

Лекция 17: Организация проекта: заголовочные файлы, раздельная компиляция, пространства имен.

  • Разделение на .h и .cpp файлы.
  • Процесс сборки: компиляция, линковка.
  • Модификаторы extern и static.
  • Пространства имен (namespace) для избежания конфликтов имен.

Семинар 17:

  • Обсуждаем сборку на примере наших проектов.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment