черновик · текст собрал Claude по репозиториям и заметкам, перепишу сам
Учебный курс по C++ — первые программы, которые я писал на этом языке руками и сдавал на проверку. Активная часть — май–октябрь 2024 года.
- Май–июнь. Поисковый сервер. Ищет документы по запросу с учётом стоп-слов и минус-слов, ранжирует по TF-IDF и рейтингу. По ходу курса к нему добавились исключения, постраничный вывод через свой
Paginator, очередь запросов, а в конце — разбиение на файлы. - Конец июня — начало июля. Препроцессор. Рекурсивно подставляет содержимое
#include-файлов черезstd::regexиstd::filesystem. - Июль. Односвязный список и SimpleVector. Свои контейнеры-шаблоны: итераторы, копирование через
swap, перемещающие конструкторы и обёрткаArrayPtr, которая сама освобождает память. - Сентябрь–октябрь. Транспортный справочник. Финальный проект: JSON на входе, SVG-карта маршрутов на выходе.
- Октябрь. json-lib. JSON-парсер из справочника в отдельном репозитории.
Параллельно, в мае–июне, — консольный тренажёр слепой печати на PDCurses.
Код учебный: в репозиториях остались тесты и заготовки курса, а мои решения местами далеки от идеала. Оставляю их как точку отсчёта.
Фрагмент
Конструктор односвязного списка из диапазона итераторов: элементы сначала собираются во временный список, а потом меняются местами с текущим — если что-то упадёт посередине, исходный список не пострадает.
template <typename Iterator>
SingleLinkedList(Iterator begin, Iterator end) {
assert(size_ == 0 && head_.next_node == nullptr);
SingleLinkedList temp;
Node** last_element_temp = &temp.head_.next_node;
while (begin != end)
{
*last_element_temp = new Node(*begin, nullptr);
last_element_temp = &(*last_element_temp)->next_node;
++temp.size_;
++begin;
}
swap(temp);
}