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

Автор: @energy_c

РКН: https://clck.ru/3QREHc
Download Telegram
👩‍💻 Осваиваем корутины — пишем асинхронный код просто и понятно!

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

Что важно знать:

Три ключевых оператора: co_await, co_yield, co_return.

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

Асинхронные функции выглядят как обычные — без вложенности и запутанных цепочек вызовов.


Это мощный инструмент современного C++, который легко интегрируется с другими фичами языка.

📣 C++ Ready | #гайд
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥216👍6
This media is not supported in your browser
VIEW IN TELEGRAM
❤️ The Algorithms C++ — огромная база алгоритмов и структур данных на C++!

Этот репозиторий отлично подойдёт тем, кто изучает алгоритмы, готовится к собеседованиям или хочет сильнее прокачать C++. Здесь собрано большое количество реализаций алгоритмов и структур данных с понятным кодом и хорошей организацией по темам. Можно не просто изучать теорию, а сразу смотреть, как алгоритмы реализуются на практике.

Оставляю ссылочку: GitHub 📱


📣 C++ Ready | #репозиторий
Please open Telegram to view this post
VIEW IN TELEGRAM
👍244🔥4
🔥 Нужен Claude Pro? Подключим быстро, оплата российской картой

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

🤔 Но оформить подписку Claude из РФ не так просто: нужна иностранная карта, а доступ может перестать работать в любой момент.

😉 Мы берём это на себя. Подключим Claude за 5–15 минут:

💳 Оплата российской картой или через СБП
⚡️ Быстрое подключение без лишних сложностей
🔒 Гарантия на весь срок подписки

😎 Более 15 000 клиентов уже доверили нам оформление зарубежных сервисов. Если возникнут вопросы — всегда поможем и восстановим доступ.

🚀 Оформи Claude уже сегодня! А по промокоду CL300 ты получишь скидку в 300 руб. на первый заказ!

Заходи и оформляй у нас 👉 Claude Store
👎11🔥2
Находим максимальный элемент через STL!

Иногда нужно найти самое большое значение: максимальную цену, лучший результат, самый длинный список или наибольший score.

Допустим, есть вектор чисел:
std::vector<int> numbers = {5, 1, 9, 3};


Можно искать максимум вручную:
int max_value = numbers[0];

for (int value : numbers) {
if (value > max_value) {
max_value = value;
}
}


Но в C++ для этого уже есть готовый алгоритм:
auto max_it = std::max_element(
numbers.begin(),
numbers.end()
);


std::max_element возвращает итератор на максимальный элемент.

Поэтому перед использованием лучше проверить, что контейнер не пустой:
if (max_it != numbers.end()) {
std::cout << *max_it << '\n';
}


На выходе получим:
9


Если нужно искать максимум не по самому объекту, а по полю, можно передать компаратор:
auto best = std::max_element(
users.begin(),
users.end(),
[](const User& a, const User& b) {
return a.score < b.score;
}
);


Такой подход удобен для рейтингов, статистики, игр, отчётов и любых коллекций объектов.

📣 C++ Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍10🔥4
This media is not supported in your browser
VIEW IN TELEGRAM
🤔 AwesomeModernC++ — большая база ресурсов по современному C++!

В этом репозитории собрана большая подборка материалов по современному C++: книги, статьи, видео, библиотеки и полезные инструменты для работы с C++11/14/17/20. Особенно полезен тем, кто хочет разобраться в STL, многопоточности, управлении памятью, шаблонах и современных практиках разработки.

Оставляю ссылочку: GitHub 📱


📣 C++ Ready | #репозиторий
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥175👍3
Сидеть и работать в корпорации — страшно, жизнь-то мимо проходит. Уходить строить бизнес — страшно, а вдруг прогорит. Один из вариантов — разрабатывать свой пет-проект по вечерам. Многие успешные компании, например, Twitter, создавались именно так. Это не значит, что ваш проект обязательно заработает миллиарды, но заработать больше, чем в найме, и получить ценный опыт — вполне реально.

Перед началом разработки появляется множество вопросов, например:

• Как выбрать идею для пет-проекта?
• Что нужно знать про маркетинг
• Как запуститься и довести до первых продаж не имея бюджета на рекламу?

В телеграм-канале «Твой пет проект», Михаил Табунов делится своим опытом с разработчиками и менеджерами.

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

Подписывайтесь на «Твой пет проект», получайте пользу от практиков рынка!
https://t.me/+8Frwa03ciVlhNTky
Удаляем элементы из vector по условию в C++20!

Допустим, есть список чисел, и нужно удалить все чётные значения.
std::vector<int> nums = {1, 2, 3, 4, 5};


Раньше для такой задачи часто использовали erase-remove idiom:
nums.erase(
std::remove_if(nums.begin(), nums.end(), [](int x) {
return x % 2 == 0;
}),
nums.end()
);


Код рабочий, но выглядит тяжеловато, особенно для простой операции.

В C++20 появился более прямой вариант:
std::erase_if(nums, [](int x) {
return x % 2 == 0;
});


Функция удалит все элементы, для которых predicate вернёт true.

После выполнения в векторе останется:
1 3 5


Так можно удалять не только числа, но и объекты.

Например, убрать неактивных пользователей:
std::erase_if(users, [](const User& user) {
return !user.active;
});


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

📣 C++ Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍6🔥4
Напоминалка по std::string_view в C++!

Например, std::string_view позволяет передать строку без копирования, если функции нужно только прочитать текст.

На картинке шпаргалка по string_view: создание, доступ к символам, получение подстроки, сравнение и важные ограничения по времени жизни данных.

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

📣 C++ Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍127🔥4
Менять vector во время обхода это плохая идея!

На первый взгляд код выглядит безобидно: идём по элементам и добавляем новые.
std::vector<int> v = {1, 2, 3};

for (int x : v) {
v.push_back(x);
}


Но у std::vector есть важная особенность: при добавлении элементов он может перевыделить память.

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

Range-based for внутри тоже использует итераторы.

Поэтому менять размер vector во время такого обхода — опасный сценарий.

Лучше сначала запомнить исходный размер:
std::size_t n = v.size();

for (std::size_t i = 0; i < n; ++i) {
v.push_back(v[i]);
}


Теперь цикл обходит только старые элементы, а новые добавляются в конец и не влияют на количество итераций.

Если заранее понятно, сколько элементов добавится, можно ещё подготовить память:
v.reserve(v.size() * 2);


Это уменьшит шанс лишних перевыделений.

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

📣 C++ Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥105👍3
Please open Telegram to view this post
VIEW IN TELEGRAM
👎9
Сортируем контейнер через std::ranges::sort!

Допустим, есть вектор чисел, и нужно отсортировать его по возрастанию.
std::vector<int> nums = {4, 1, 7, 3};


Раньше обычно писали так:
std::sort(nums.begin(), nums.end());


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

В C++20 можно использовать ranges-версию:
std::ranges::sort(nums);


Теперь алгоритм принимает контейнер целиком.

После сортировки получим:
1 3 4 7


Если нужно отсортировать объекты по полю, можно использовать projection:
std::ranges::sort(users, {}, &User::score);


Здесь сортировка идёт не по всему объекту, а по полю score.

Это удобно для рейтингов, таблиц лидеров, списков товаров, отчётов и любых коллекций, где нужно быстро упорядочить данные.

📣 C++ Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥73
Не копируй элементы в цикле, если их можно читать по ссылке!

В C++ range-based for часто пишут так:
for (auto x : items) {
use(x);
}


Для int или char это нормально.

Но если внутри лежат строки, структуры, объекты или большие классы, каждый элемент будет копироваться.
Например:
for (auto user : users) {
std::cout << user.name << '\n';
}


Если User тяжёлый, такой цикл создаёт лишние копии.

Когда нужно только читать элементы, лучше использовать const auto&:
for (const auto& user : users) {
std::cout << user.name << '\n';
}


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

Если элемент нужно менять тогда используют обычную ссылку:
for (auto& user : users) {
user.active = true;
}


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

📣 C++ Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
15👍8🔥5😁2
Почему std::string_view может неожиданно превратиться в висячую ссылку?

std::string_view не хранит собственную строку. Он содержит только ссылку на уже существующие символы.

Поэтому возвращать view на локальный std::string опасно:

std::string_view make_name() {
std::string name = "Ready";
return name;
}


После выхода из функции name уничтожается, а результат указывает в освобождённую память.

Если функция создаёт новую строку, возвращай std::string:

std::string make_name() {
return "Ready";
}


view также может стать недействительным после изменения исходной строки:

std::string text = "C++";
std::string_view view = text;

text += std::string(100, '!');


При расширении text может получить новый буфер, а view останется связан со старым.

Безопасный вариант будет использовать данные с достаточным временем жизни:

constexpr std::string_view channel = "C++ Ready";
std::cout << channel;


Строковый литерал существует до завершения программы, поэтому такой view остаётся корректным.

📣 C++ Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍64👎1
This media is not supported in your browser
VIEW IN TELEGRAM
💅 Core Guidelines — как писать качественный код на C++!

Это набор рекомендаций по современному C++, который помогает писать более безопасный, понятный и поддерживаемый код. Здесь собраны практические правила по работе с памятью, классами, функциями, шаблонами, ошибками и архитектурой.

Оставляю ссылочку: GitHub 📱


📣 C++ Ready | #репозиторий
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥159👍6
😒 Официальная библиотека промптов для Claude от Anthropic

Разработчики из Anthropic обновили и структурировали масштабный хаб готовых запросов для своей языковой модели. База создана для того, чтобы пользователи могли выжать максимум из Claude при решении прикладных и технических задач, не тратя время на самостоятельный подбор формулировок.

⚡️Внутри собраны сотни шаблонов под самые разные сценарии:
🟦Для безопасности: готовые конструкции для проверки кода на уязвимости и анализа граничных условий работы алгоритмов.

🟦Для разработчиков: шаблоны для глубокого ревью кода, автоматического поиска багов, рефакторинга, написания юнит-тестов и проектирования архитектуры.

🟦Для автоматизации и менеджмента: промпты под стратегическое планирование, парсинг неструктурированных данных, генерацию технической документации и выстраивание логики для ИИ-агентов.


Каждый шаблон снабжен подробным разбором: авторы пошагово объясняют, почему выбрана именно такая структура запроса, как модель интерпретирует переменные и как правильно передавать контекст. Поскольку библиотека официальная, все промпты оптимизированы под особенности контекстного окна и логику мышления последних моделей семейства Claude.

❤️‍🩹Сохраняйте в закладки и внедряйте в свои рабочие процессы.

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

Если вы хотите заложить мощный фундамент начните с нашего бесплатного курса (его прошли уже 1108 человек!).

🟦Разберетесь, как работают кибератаки и как грамотно защитить свои данные.

🟦Познакомитесь с направлениями и профессиями в кибербезопасности, чтобы выбрать свой трек.

🟦Получите скидку, если решите продолжить обучение в CyberYozh Academy.


👉 Начните бесплатно прямо сейчас
🦔 CyberYozh
Please open Telegram to view this post
VIEW IN TELEGRAM
3🔥1
Измеряем время выполнения блока кода на C++!

Создадим небольшой RAII-таймер. Он начнёт измерение при создании и автоматически покажет результат при выходе из области видимости.

Сохраним название операции и время запуска:
class ScopeTimer {
std::string name_;
std::chrono::steady_clock::time_point start_;


Добавим конструктор:
public:
explicit ScopeTimer(std::string name)
: name_(std::move(name)),
start_(std::chrono::steady_clock::now()) {}


В деструкторе вычислим прошедшее время:
    ScopeTimer() {
const auto elapsed =
std::chrono::steady_clock::now() - start_;

const auto microseconds =
std::chrono::duration_cast<
std::chrono::microseconds
>(elapsed);


Остаётся вывести результат и закрыть класс:
        std::cout << name_ << ": "
<< microseconds.count()
<< " us\n";
}
};


Теперь измерим сортировку:
{
ScopeTimer timer("sorting");
std::ranges::sort(values);
}


После выхода из блока деструктор вызовется автоматически:
sorting: 1842 us


steady_clock подходит для измерения интервалов, потому что не зависит от перевода системных часов.

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