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

Автор: @energy_c

РКН: https://clck.ru/3QREHc

Реклама на бирже: https://telega.in/c/cpp_ready
Download Telegram
Разбираем std::format и форматирование строк!

std::format помогает собирать строки без цепочек operator<< и без ручной склейки. Форматирование становится ближе к шаблону, где видно итоговую форму текста.

В этой шпоре собраны format, format_to, formatted_size, format_to_n, std::print, chrono formatting и custom formatter.

📣 C++ Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍43🤝1
Шпаргалка по range views в C++20 и C++23!

Например, views::filter оставляет только подходящие элементы, views::transform применяет функцию к каждому значению, а views::zip и views::chunk помогают собирать более сложные ленивые цепочки обработки.

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

📣 C++ Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍75🔥4
Собираем потокобезопасную очередь на C++!

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

В этой задаче:
• храним queue под mutex
• будим ожидающий поток через condition_variable
• достаём элементы через wait_and_pop


Такую основу можно использовать для worker-пула, фоновой обработки логов, очереди событий или простого producer-consumer сценария.

📣 C++ Ready | #задачу
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍8🔥4
Напоминалка по lambda expressions в C++!

Например, capture by reference позволяет лямбде работать с внешней переменной напрямую, capture by value сохраняет копию значения, а mutable даёт менять захваченную копию внутри лямбды.

На картинке собраны основные приёмы работы с lambda expressions. Есть захваты по ссылке и по значению, init capture, immediately invoked lambdas, mutable lambdas, generic lambdas, perfect forwarding и возможности C++20.

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

📣 C++ Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍6🔥3
Разбираем std::variant: как хранить разные типы без unsafe union!

std::variant помогает описывать значения, которые могут быть одним из нескольких заранее известных типов. Это удобно для парсеров, состояний, команд, ошибок и ответов API: данные остаются типобезопасными, а компилятор помогает не забыть обработать нужные варианты.

📣 C++ Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥115👍3
Зачем в C++ помечать важные результаты через [[nodiscard]]?

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

Например:
bool save_config() {
return write_file("config.json");
}

save_config();


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

Для таких случаев есть атрибут [[nodiscard]]:
[[nodiscard]]
bool save_config() {
return write_file("config.json");
}


Теперь компилятор предупредит, если результат вызова проигнорировали:
save_config(); // warning


Правильнее явно обработать результат:
if (!save_config()) {
std::cerr << "Config was not saved\n";
}


Особенно полезно помечать функции, которые возвращают объект ошибки:
[[nodiscard]]
std::optional<User> find_user(int id);


Или результат проверки:
[[nodiscard]]
bool is_valid_token(std::string_view token);


Если результат действительно нужно проигнорировать, лучше показать это явно:
(void)save_config();


Так сразу видно, что разработчик сделал это осознанно, а не случайно.

📣 C++ Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍7🔥3
Интересная статья про компилятор на C++ и LLVM!

Автор рассказывает, как писал собственный язык Marble и постепенно собирал вокруг него lexer, parser, AST, генерацию LLVM IR и диагностику ошибок.

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

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


📣 C++ Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
👍93🔥3😁1
Уже очевидно, что ВАЙБКОДИНГ — главный навык ближайших лет

Посмотрите сами. ИИ уже забирает на себя работу целых команд: пишет код, закрывает задачи джунов и позволяет стартапам запускать продукты в 2–3 раза меньшим составом. То, на что раньше нужны были несколько разработчиков, сегодня всё чаще делает один человек с ИИ-агентами.

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

Начать с нуля поможет канал Вайб-кодинг. Там ребята круглосуточно мониторят более 320 российских и зарубежных источников и публикуют только главное: релизы, инструменты, гайды, курсы и практические кейсы.

Подписывайтесь, нас уже 60 тысяч: @vibecoding_tg
👎8😁8
Почему structured binding может неожиданно копировать данные?

В C++ structured binding удобно распаковывает пары, tuple и элементы map:
auto item = std::pair{1, std::string("ready")};

auto [id, name] = item;


Но здесь id и name это копии значений из item.

Если изменить name, исходная пара не изменится:
name = "cpp";

std::cout << item.second; // ready


Для маленьких чисел это неважно, но для строк, векторов и больших объектов можно получить лишние копирования.

Если нужно работать с исходными значениями, используй ссылку:
auto& [id, name] = item;

name = "cpp";


Теперь меняется сам объект:
std::cout << item.second; // cpp


То же самое часто встречается при обходе map:
for (auto [key, value] : users) {
value.active = false;
}


Такой код меняет копию value, а не элемент внутри map.

Правильно, если нужно менять данные:
for (auto& [key, value] : users) {
value.active = false;
}


А если нужно только читать без копий:
for (const auto& [key, value] : users) {
std::cout << key << value.name;
}


Structured binding удобная штука. Для реальных данных чаще нужны auto& или const auto&.

📣 C++ Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥43👍3