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

Автор: @energy_it

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

Реклама на бирже: https://telega.in/c/cpp_ready
Download Telegram
👩‍💻 std::visit и паттерн overload!

Когда обработчиков для std::variant становится много, код может расползаться, а паттерн overload собирает все ветки в одном месте и делает чтение проще.

В этом гайде:

Покажем минимальный helper overload, который объединяет несколько лямбд;

Разберем пример с разными типами в std::variant, чтобы увидеть структуру обработчика;

Применим тот же прием к обработке событий, где важна явность каждой ветки.


После этого вы сможете писать обработчики visit компактно и при этом сохранять строгую типизацию.

📣 C++ Ready | #гайд
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥219👍4🤝1
✍️ Нашёл интересный материал на Хабре — история о том, как OpenCV прошёл путь от смелой идеи до одного из самых известных проектов в компьютерном зрении!

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

• Как зарождался OpenCV и какую роль в этом сыграли люди из Intel.
• Почему развитие проекта во многом определяли случайности, энтузиазм и удачные решения.
• Как OpenCV смог вырасти в инструмент мирового уровня и получить признание сообщества.

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


📣 C++ Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
9🔥4👍3
Почему unordered_map может быть медленнее map?

Потому что в реальном коде все сложнее, чем просто O(1) против O(log N).

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

У map асимптотика хуже, но иногда она ведет себя стабильнее. Особенно если важны предсказуемость, порядок элементов или нормальная locality на конкретных данных.

Из-за этого код в духе:
sum += um["user_" + std::to_string(i)];


не всегда оказывается быстрее, чем:
sum += m["user_" + std::to_string(i)];


То есть контейнер “быстрее по учебнику” может проиграть в проде.

🔥 Для важного кода контейнер лучше мерить, а не выбирать по мифу про O(1).

📣 C++ Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥127👍6
Что же выведет консоль?
Anonymous Quiz
64%
A
13%
B
13%
C
10%
D
9👍4🔥4
Когда инвалидируются итераторы в STL-контейнерах?

Одна из самых неприятных ошибок в C++ — сохранить итератор, указатель или ссылку на элемент контейнера, а потом продолжить использовать их после изменения контейнера.

Проблема в том, что после некоторых операций такие объекты становятся невалидными. Код может ещё долго “работать”, а потом внезапно упасть или начать давать странные результаты.

Частый случай — std::vector: если после push_back() произошла reallocation, все итераторы, указатели и ссылки на элементы инвалидируются.

Пример:
std::vector<int> v{1, 2, 3};

auto it = v.begin();
v.push_back(4); // может перевыделить память

int x = *it; // UB: итератор мог стать невалидным

С std::vector важно помнить:
push_back, emplace_back, insert могут инвалидировать все итераторы, если контейнер перевыделил память;
erase инвалидирует итераторы от удалённого элемента и дальше до конца;
clear инвалидирует всё.

У std::unordered_map тоже есть ловушка: при rehash инвалидируются все итераторы.

Пример:
std::unordered_map<int, int> m{{1, 10}, {2, 20}};

auto it = m.find(1);
m.reserve(100); // может вызвать rehash

int x = it->second; // итератор может быть уже невалиден


А вот у std::list и std::map поведение стабильнее: вставка обычно не ломает уже существующие итераторы, но удаление элемента инвалидирует итератор именно на него.

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

🔥 Если контейнер изменился, старым итераторам и ссылкам лучше больше не доверять.

📣 C++ Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥107👍5
This media is not supported in your browser
VIEW IN TELEGRAM
☕️ Ultimate Awesome — огромная подборка с ресурсам!

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

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


📣 C++ Ready | #репозиторий
Please open Telegram to view this post
VIEW IN TELEGRAM
14👍8🔥7
👩‍💻 Лямбды в C++ без магии и путаницы!

В этой шпаргалке — как работают operator(), захваты [], [=], [&], [this], зачем нужен mutable и когда стоит явно указывать возвращаемый тип через ->, чтобы писать лямбды увереннее и без скрытых ошибок

📣 C++ Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🤝41🔥28👍81
Почему 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