C/C++ Ready | Программирование
14.3K subscribers
1.36K photos
87 videos
667 links
Авторский канал по разработке на C и C++.
Ресурсы, гайды, задачи, шпаргалки.
Информация ежедневно пополняется!

Автор: @energy_c

РКН: https://clck.ru/3QREHc
Download Telegram
Очень интересная статья о том, как автор пытался воссоздать Minecraft на C++ и Vulkan за одну неделю!

В этой статье:
• Как устроена идея voxel-мира и генерации чанков
• Почему Vulkan требует аккуратной работы с рендерингом и ресурсами
• Как маленький прототип постепенно превращается в собственный игровой движок

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


📣 C++ Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
7🔥7👍5
Напоминалка по алгоритмам стандартной библиотеки C++!

Например, std::find_if помогает найти элемент по условию, std::sort сортирует диапазон, а std::transform удобно применять для преобразования значений без ручного цикла.

На картинке шпаргалка по STL-алгоритмам: поиск, сравнение диапазонов, сортировка, partition, rotate, copy, transform, remove, unique и числовые алгоритмы из <numeric>.

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

📣 C++ Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥85👍3
Опа, тут бывший сеньор одного из IT-отделов Яндекса Игорь Никитин выкатил целый канал про Python — и это лучшее, что есть в рунете по теме.

Качественные гайды. Советы от известных прогеров. Тематические мемасы. Короче, ничего лишнего.

Хватит душить питона, учись его кодить: https://t.me/+IzIPzvoa7p40ZTUy 🐍
👎8👍1
Собираем маленький scope guard!

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

Писать cleanup руками в каждом return неудобно:
void process() {
enable();

if (!check_input()) {
disable();
return;
}

run_job();
disable();
}


Если return станет больше, легко забыть один из вызовов disable().

Сделаем небольшой scope guard:
#include <functional>
#include <utility>

class ScopeExit {
public:
explicit ScopeExit(std::function<void()> fn)
: fn_(std::move(fn)) {}


В деструкторе он выполнит переданную функцию:
    ~ScopeExit() {
if (fn_) {
fn_();
}
}


Запретим копирование, чтобы cleanup не вызвался дважды:
    ScopeExit(const ScopeExit&) = delete;
ScopeExit& operator=(const ScopeExit&) = delete;


Поля класса:
private:
std::function<void()> fn_;
};


Теперь очистка привязана к области видимости:
void process() {
enable();

ScopeExit guard([] {
disable();
});

if (!check_input()) {
return;
}

run_job();
}


disable вызовется и при обычном завершении, и при раннем return.

Тот же подход удобен для временных файлов:
ScopeExit cleanup([&] {
std::filesystem::remove(path);
});


И для восстановления старого значения:
bool old = config.debug;
config.debug = true;

ScopeExit restore([&] {
config.debug = old;
});


Scope guard это простой способ сделать cleanup надёжным. Код меньше зависит от того, сколько return появится внутри функции.

📣 C++ Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍3🔥3