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

Автор: @energy_it

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

Реклама на бирже: https://telega.in/c/cpp_ready
Download Telegram
Почему std::remove не удаляет элементы из vector?

Потому что алгоритм не меняет размер контейнера. Он просто сдвигает нужные элементы в начало диапазона и возвращает итератор на новый логический конец.

После такого кода:
std::vector<int> v = {1, 2, 3, 2, 4};
std::remove(v.begin(), v.end(), 2);


размер вектора остаётся 5. В хвосте просто остаются элементы, которые больше не считаются валидными.

Чтобы реально удалить их из контейнера, нужен второй шаг:
v.erase(std::remove(v.begin(), v.end(), 2), v.end());


🔥 std::remove не удаляет, он только переставляет элементы. Настоящее удаление начинается с erase.

📣 C++ Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥176👍5
This media is not supported in your browser
VIEW IN TELEGRAM
💡 Каталог современных шаблонов языка!

C++ Patterns — тут собраны лаконичные карточки-паттерны с рабочими примерами кода, указанием минимального стандарта языка и подробным описанием назначения приёма.

📌 Оставляю ссылочку: cpppatterns.com

📣 C++ Ready | #сайт
Please open Telegram to view this post
VIEW IN TELEGRAM
16🔥6👍5
This media is not supported in your browser
VIEW IN TELEGRAM
✍️ Build Your Own X — освойте программирование, воссоздав любимые технологии с нуля!

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

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


📣 C++ Ready | #репозиторий
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1410👍8
scope_exit в C++: cleanup без goto и забытых close()

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

В таких местах удобно использовать маленький RAII-хелпер, который выполнит переданную лямбду при выходе из scope. Это особенно полезно в коде с исключениями и несколькими точками выхода.

Начнём с самого класса:
template <class F>
class scope_exit {
F fn;
bool active = true;


Он хранит функцию cleanup и флаг, нужно ли её вызывать.
public:
explicit scope_exit(F f) : fn(std::move(f)) {}
~scope_exit() { if (active) fn(); }


В деструкторе cleanup выполнится автоматически, если guard ещё активен.
    void release() noexcept { active = false; }
};


release() нужен, если в каком-то сценарии cleanup уже не требуется.

Теперь добавим маленький helper, чтобы не писать тип вручную:
template <class F>
scope_exit<F> make_scope_exit(F f) {
return scope_exit<F>(std::move(f));
}


С ним использование получается заметно чище.

Открываем файл и сразу вешаем cleanup рядом:
FILE* f = std::fopen("data.bin", "wb");
if (!f) throw std::runtime_error("open failed");

auto guard = make_scope_exit([&] { std::fclose(f); });


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

Дальше могут быть любые ранние выходы:
if (std::rand() % 2)
return;

std::fwrite("abc", 1, 3, f);


Даже если функция завершится раньше, fclose всё равно вызовется автоматически.

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

🔥 Маленький RAII-хелпер, который точно вам поможет!

📣 C++ Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥154👍3👎2
👍 Сильная статья — отличный вход в эмуляцию микропроцессоров через практику, память и декодирование инструкций.

В этой статье:

• Что такое эмулятор микропроцессора и как он повторяет поведение реального CPU
• Базовый каркас эмулятора: память, регистры, декодирование и выполнение инструкций
• Разбор режимов адресации MOS6502 и их реализация на C++ с примерами кода

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


📣 C++ Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥104👍3
👩‍💻auto и вывод типов без лишней путаницы!

В этой шпаргалке — простое объяснение того, как C++ выводит типы при объявлении переменных: когда ты неожиданно получаешь копию вместо ссылки, как безопасно “подцепить” объект без лишнего копирования

📣 C++ Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥26👍54🤝1
This media is not supported in your browser
VIEW IN TELEGRAM
👍 OverAPI — огромная база шпаргалок для программистов!

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

📌 Оставляю ссылочку: overapi.com

📣 C++ Ready | #сайт
Please open Telegram to view this post
VIEW IN TELEGRAM
15👍9🔥8
Почему std::move не делает move?

Многие воспринимают std::move как команду на перенос. Но на самом деле он ничего не перемещает сам по себе. Он только приводит объект к rvalue, а дальше уже перегрузки решают, что будет вызвано: move или copy.

В этом примере проблема в const. После std::move(p) тип выражения — const Packet&&. Но move-конструктор обычно принимает Packet&&, то есть неконстантный rvalue. Такой конструктор сюда не подходит, поэтому вызывается копирование.

Из-за этого легко получить неожиданный copy там, где по коду вроде бы явно написан move. Особенно неприятно, когда это происходит внутри контейнеров или в горячем участке кода.

Если объект действительно нужно переместить, он не должен быть const.
Packet p{"payload"};
q.push_back(std::move(p)); // move


Именно поэтому std::move — это не перенос, а всего лишь приведение. Он дает возможность вызвать move, но не гарантирует его.

🔥 std::move сам ничего не двигает. Если объект const, вместо move ты почти наверняка получишь copy.

📣 C++ Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥135👍4
This media is not supported in your browser
VIEW IN TELEGRAM
📂 Напоминалка по парадигмам программирования!

Например, Imperative Programming описывает программу как последовательность шагов, которые изменяют состояние, а Object-Oriented Programming строит код вокруг объектов и классов.

На картинке — 4 важные парадигмы программирования, которые используются в современных языках.

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

📣 C++ Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍7🔥7
👩‍💻 Сжимаем и восстанавливаем строки с помощью RLE (Run-Length Encoding)

Сегодня реализуем алгоритм сжатия строк с помощью RLE (Run-Length Encoding), а также восстановление строки из сжатого представления.

В этой задаче:

Считаем длину последовательностей одинаковых символов и сразу добавляем в результат

При распаковке парсим число и столько раз добавляем следующий символ.

Проверяем корректность: сжимаем → распаковываем → сравниваем строки.


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

📣 C++ Ready | #задача
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍43