
Алгоритмы STL вместо ручных циклов: семь способов и цена каждого
Ручной for c индексом переживает все рефакторинги и прячет по одной ошибке off-by-one на брата. Разбираем семь стандартных алгоритмов STL, где каждый уместен и чем платит.

Ручной for c индексом переживает все рефакторинги и прячет по одной ошибке off-by-one на брата. Разбираем семь стандартных алгоритмов STL, где каждый уместен и чем платит.

vector, list, map, unordered_map, deque — выбор контейнера меняет и скорость, и потребление памяти в разы. Разбираем, за что вы платите при каждом выборе.

Шаблоны позволяют написать одну функцию для int, double и своих типов вместо трёх копий. Разбираем на рабочих примерах, как объявить шаблон функции и класса и почему их держат в заголовке.

std::move — не «ускорь тут». Разбираем, когда move реально экономит аллокации, а когда компилятор всё делает сам, и на каких приёмах теряется вся выгода.

Класс с сырым указателем компилируется, проходит тесты и падает с double free в проде. Разбираем, почему компилятор генерирует неправильные операции и когда владеющий ресурсом класс должен объявить все пять.

unique_ptr почти бесплатный, shared_ptr тянет за собой атомарный счётчик и лишнюю аллокацию, а weak_ptr существует, чтобы разорвать циклы. Разбираем, что выбирать под конкретную задачу и чем платите за каждый вариант.

Утечки, двойное освобождение и забытый unlock — почти всегда следствие ручного управления ресурсами. RAII убирает эти классы ошибок целиком, привязывая владение ресурсом к времени жизни объекта.

Undefined reference, multiple definition, циклические зависимости заголовков — разбираем частые ошибки сборки C++ и что делать с каждой, от препроцессора до линковки.

За полчаса научитесь запускать программу под GDB, ставить точки останова, смотреть значения переменных и ловить падение по сегфолту — без чтения многостраничного мануала.

Как читать и писать файлы в C++ через fstream: текстовый и бинарный режим, построчное чтение, проверка ошибок и типичные грабли с кодировкой и позицией курсора.

Программа читает число, а следом застревает на getline. Разбираем, почему так происходит, зачем нужен endl и как не превратить cin в источник бесконечного цикла.

Что происходит между командой g++ main.cpp и готовым исполняемым файлом: препроцессор, компиляция, ассемблирование, компоновка. Разбираем каждую стадию на команде и видим её отдельный вывод.