C/C++ Ready | Программирование


Channel's geo and language: Russia, Russian
Category: Technologies


Авторский канал по разработке на C и C++.
Ресурсы, гайды, задачи, шпаргалки.
Информация ежедневно пополняется!
Автор: @energy_c
РКН: https://clck.ru/3QREHc
Реклама на бирже: https://telega.in/c/cpp_ready

Зарегистрирован в РКН
Related channels  |  Similar channels

Channel's geo and language
Russia, Russian
Statistics
Posts filter


Разбираем std::format и форматирование строк!

std::format помогает собирать строки без цепочек operator


Считаем размер папки через std::filesystem!

Иногда нужно быстро понять, сколько места занимает директория. Например, перед очисткой, анализом или проверкой файлов.

В C++17 для обхода файловой системы есть std::filesystem.

Подключим нужные заголовки:
#include
#include

Для удобства заведём namespace:

namespace fs = std::filesystem;

Функция будет принимать путь к папке:

std::uintmax_t dir_size(const fs::path& root) {

Сначала заведём счётчик байт:

std::uintmax_t total = 0;

Теперь рекурсивно обойдём директорию:

for (const auto& entry : fs::recursive_directory_iterator(root)) {

Нас интересуют только обычные файлы. Папки и ссылки можно пропустить:

if (!entry.is_regular_file()) continue;

Размер файла добавляем в общий счётчик:

total += entry.file_size();

После обхода возвращаем результат:

return total;
}

Вызов может выглядеть так:

auto bytes = dir_size("logs");
std::cout


Полезная статья про автоматическую проверку архитектуры C++-проекта!

Автор разбирает инструмент archcheck, который помогает описать правила зависимостей между модулями и проверять, что кодовая база не превращается в хаотичный клубок include-связей.

В статье автор показывает:
• как описывать допустимые зависимости между частями проекта
• как находить нарушения архитектурных границ
• почему такие проверки полезно запускать в CI

Продолжай читать на Habr


📣 C++ Ready | #статья


Интересный разбор архитектуры сцен в графических движках!

В статье автор разбирает, почему классический Scene Graph не всегда хорошо ложится на современные render pipeline, explicit API и задачи с большим количеством объектов.

В статье автор показывает:
• почему древовидная сцена может мешать производительности
• как думать о данных, зависимостях и проходах рендера
• почему современному движку часто нужен более гибкий подход

Продолжай читать на Habr!


📣 C++ Ready | #статья


Почему из map нельзя удалять элементы как попало во время обхода?

Иногда нужно пройтись по контейнеру и удалить часть элементов. Например, убрать просроченные сессии, пустые записи, старые токены или временные ключи после фоновой очистки.

На первый взгляд хочется написать обычный цикл.
for (auto it = cache.begin(); it != cache.end(); ++it) {
if (it->second.expired()) cache.erase(it);
}

Выглядит логично. Мы стоим на элементе, проверяем его и удаляем, если он больше не нужен.

Но после erase(it) итератор it становится невалидным. А в конце итерации цикл всё равно попробует выполнить ++it.

То есть программа двигает уже сломанный итератор. Такое поведение может проявиться не сразу, а только на некоторых данных или сборках.

Правильный паттерн такой.
for (auto it = cache.begin(); it != cache.end(); ) {
if (it->second.expired()) {
it = cache.erase(it);
} else {
++it;
}
}

erase возвращает итератор на следующий элемент. Поэтому после удаления мы не делаем ++it вручную, а сразу продолжаем обход с корректной позиции.

Если элемент не удалили, тогда обычный ++it нужен. Именно поэтому инкремент убирают из заголовка for.

Для std::map и std::unordered_map это особенно важно, когда очистка идёт по условию внутри цикла.

Если нужно просто удалить всё по предикату и у вас C++20, можно использовать std::erase_if.
std::erase_if(cache, [](const auto& item) {
return item.second.expired();
});

Но явный цикл всё равно полезно знать. Он нужен, когда вместе с удалением нужно логировать, считать статистику или выполнять дополнительное действие.

Главная мысль простая. Если удаляешь элемент через итератор во время обхода, следующий итератор должен прийти из erase, а не из ++ после удаления.

Есть ещё одна частая ошибка. Иногда удаление пытаются спрятать внутрь range-for.

Так делать не стоит.
for (auto& [key, value] : cache) {
if (value.expired()) cache.erase(key);
}

Range-for сам управляет итератором внутри цикла. Если контейнер меняется во время обхода, этот внутренний итератор тоже может стать невалидным.

Поэтому для удаления по условию лучше сразу писать явный итераторный цикл. Он чуть длиннее, зато в нём видно, где именно происходит переход к следующему элементу.

Если внутри удаления есть дополнительные действия, их тоже удобно держать рядом.
if (it->second.expired()) {
log_removed(it->first);
it = cache.erase(it);
}

Такой код проще читать при ревью. Видно и условие удаления, и побочный эффект, и безопасное обновление итератора.

📣 C++ Ready | #совет


Собираем ring buffer на C++!

Нужно хранить только последние N значений. Когда буфер заполнен, новое значение должно вытеснять самое старое.

В этой задаче:
• держим данные в std::array
• считаем позицию через остаток от деления
• не двигаем элементы вручную


Такой приём полезен для метрик, логов, истории последних событий и небольших очередей фиксированного размера.

📣 C++ Ready | #задача




Разбираем std::unordered_map 7 методов для работы с ключами!

std::unordered_map удобен, когда нужен быстрый доступ по ключу без сортировки. Внутри это хеш-таблица, поэтому важно не только доставать значения, но и правильно добавлять, обновлять и заранее готовить место.

Полезно для кешей, индексов, счётчиков, таблиц соответствий и быстрых lookup-структур.

📣 C++ Ready | #шпора


Video is unavailable for watching
Show in Telegram
Modern C++ Tutorial — гид по возможностям C++11–C++26!

На сайте собран открытый учебник по современному C++: auto, range-based for, lambda-выражения, rvalue references, move semantics, smart pointers, concurrency, templates, type traits, constexpr, filesystem и другие возможности новых стандартов. Материал хорошо подходит тем, кто уже знает базовый C++, но хочет перейти от старого стиля к современным приёмам и лучше понимать, зачем появились новые конструкции языка.

Оставляю ссылочку: Modern C++ Tutorial


📣 C++ Ready | #ресурс




Делаем простой string pool на C++!

Если в программе много повторяющихся строк вроде ролей, статусов, тегов или категорий, их можно хранить в одном месте и переиспользовать. Для этого подойдёт небольшой пул строк на базе std::unordered_set.

В этой задаче:
• храним уникальные строки;
• добавляем значение через insert;
• возвращаем ссылку на сохранённую строку;


Такой приём помогает уменьшить лишние копии и сделать работу с повторяющимися строками аккуратнее.

📣 C++ Ready | #задача


Считаем топ самых частых слов на C++!

Иногда нужно быстро понять, какие слова чаще всего встречаются в тексте: в логах, комментариях, поисковых запросах или простом анализаторе.

Сначала заведём счётчик:
std::unordered_map freq;

Разобьём строку на слова:
std::istringstream in(text);
std::string word;

while (in >> word) {
++freq[word];
}

Теперь переложим пары в vector:
std::vector items(
freq.begin(), freq.end()
);

Отсортируем по частоте:
std::sort(items.begin(), items.end(),
[](const auto& a, const auto& b) {
return a.second > b.second;
});

Выведем первые 3 слова:
for (std::size_t i = 0; i < std::min(3, items.size()); ++i) {
std::cout


Шпаргалка по новым возможностям C++17!

Например, structured bindings позволяют удобно распаковывать пары и tuple, а if constexpr помогает выбирать ветку кода на этапе компиляции.
На картинке ключевые фичи C++17: class template argument deduction, fold expressions, constexpr lambda, inline variables, nested namespaces, structured bindings, initializers в if/switch, `fallthrough`, `nodiscard`, `maybe_unused` и другие изменения языка.

Сохрани, чтобы не потерять!

📣 C++ Ready | #ресурс



14 last posts shown.