Библиотека C/C++ разработчика | cpp, boost, qt
19.8K subscribers
1.92K photos
58 videos
16 files
4.15K links
Все самое полезное для плюсовика и сишника в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/d6cd2932

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17
Download Telegram
🍴 Callback chain (цепочка обработчиков)

Надоело писать if-else лесенки для обработки событий? Лямбды превращают это в изящную цепочку.


Паттерн Chain of Responsibility через лямбды позволяет регистрировать обработчики, которые выполняются последовательно, пока кто-то не обработает событие:

#include <vector>
#include <functional>
#include <algorithm>

template<typename Event>
class CallbackChain {
using Handler = std::function<bool(const Event&)>;
std::vector<Handler> handlers_;

public:
// Добавить обработчик в конец цепочки
void add_handler(Handler handler) {
handlers_.push_back(std::move(handler));
}

// Добавить обработчик в начало (высокий приоритет)
void add_handler_front(Handler handler) {
handlers_.insert(handlers_.begin(), std::move(handler));
}

// Обработать событие (возвращает true, если кто-то обработал)
bool handle(const Event& event) const {
for (const auto& handler : handlers_) {
if (handler(event)) {
return true; // Обработчик вернул true - останавливаемся
}
}
return false; // Никто не обработал
}

// Уведомить всех обработчиков (не останавливаясь)
void notify_all(const Event& event) const {
for (const auto& handler : handlers_) {
handler(event); // Игнорируем возвращаемое значение
}
}

// Очистить все обработчики
void clear() { handlers_.clear(); }

size_t size() const { return handlers_.size(); }
};


Использование для обработки HTTP-запросов:

struct HttpRequest {
std::string path;
std::string method;
std::map<std::string, std::string> params;
};

CallbackChain<HttpRequest> router;

// Регистрируем обработчики
router.add_handler([](const HttpRequest& req) {
if (req.path == "/api/users" && req.method == "GET") {
handle_get_users();
return true; // Обработали
}
return false; // Не наш запрос
});

router.add_handler([](const HttpRequest& req) {
if (req.path.starts_with("/api/")) {
return handle_api_request(req);
}
return false;
});

// В главном цикле
void process_request(const HttpRequest& req) {
if (!router.handle(req)) {
send_404_error();
}
}


Библиотека C/C++ разработчика

#шаблонный_код
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7👏2🎉21🌚1
🚀 В IT ценится не перфекционизм, а движение вперёд, и если вы давно откладывали обучение — самое время начать.

❤️ Proglib Academy продлевает розыгрыш MacBook Pro 14 до 30 ноября!

Что нужно:

⚡️ выбрать курс;
⚡️ пройти минимум две недели обучения (можно за два вечера);
⚡️ написать куратору #розыгрыш;
⚡️ забрать макбук.

🎓 Курсы, которые участвуют

👉 Участвовать
🍿 Лямбды в STL: где они сияют

STL-алгоритмы — основное применение лямбд в C++. Они превратили императивные циклы в декларативные выражения, делающие код выразительнее и безопаснее.

Классика — std::transform:
std::transform(vec.begin(), vec.end(), vec.begin(), [](int x) { return x * 2; });


умножает все элементы на два. Или std::sort с кастомным компаратором:
std::sort(vec.begin(), vec.end(), [](const auto& a, const auto& b) { return a.priority > b.priority; });



Предикатные алгоритмы особенно элегантны:
std::count_if, std::find_if, std::remove_if


Вместо циклов с условиями — одна строка:
auto count = std::count_if(vec.begin(), vec.end(), [](int x) { return x > 0; });

Логика фильтрации инкапсулирована и переиспользуема.


C++20 ranges делают это ещё лучше:
auto result = vec | std::views::filter([](int x) { return x % 2 == 0; }) | std::views::transform([](int x) { return x * x; });

— цепочка трансформаций без промежуточных контейнеров.

Лямбды с алгоритмами — это функциональное программирование в C++. Код становится декларативным, меньше ручного управления итераторами, меньше ошибок off-by-one. Оптимизатор видит больше возможностей для векторизации.

Как часто вы заменяете циклы на STL-алгоритмы с лямбдами?

Библиотека C/C++ разработчика

#междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13😢4😁2🌚1
🔥 std::flat_map в C++23 — быстрее std::map в 3-5 раз?

Представьте: вы профилируете код и видите, что std::map тормозит. Cache misses, фрагментация памяти, медленный поиск.


C++23 представляет std::flat_map и std::flat_set — адаптеры контейнеров, которые хранят элементы в непрерывной памяти. Вместо узлов дерева — два плоских массива (ключи + значения).

#include <flat_map>

std::flat_map<int, std::string> cache{
{1, "one"}, {2, "two"}, {3, "three"}
};

// Все элементы рядом в памяти — процессор доволен
auto it = cache.find(2); // Бинарный поиск по упорядоченному массиву


❗️ Главные преимущества:

• Меньше cache misses → быстрее на реальных данных
• Меньше аллокаций памяти
• Лучше для read-heavy сценариев

✏️ Когда использовать? Если у вас много поисков и мало изменений — flat_map будет более производительным чем классический map.

Библиотека C/C++ разработчика

#константная_правильность
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰4👍3
🎓 Экспресс-курс «Математика для Data Science» стартует 4 декабря

Этот курс для вас, если вы:

🧑‍💻 Программист
Когда нужно понять, что происходит «под капотом» ML-алгоритмов.

📊 Начинающий DS / аналитик / студент
Чтобы закрыть теорию, подтянуть фундамент и собрать портфолио.

📈 Смежный специалист
Чтобы уверенно работать с моделями, статистикой и гипотезами.

🎁 Сейчас лучший момент стартовать:
— скидка 40% на курс до конца ноября
— можно пройти бесплатный тест на знание основ математики

👉 Записаться на курс
😁1🥱1
Forwarded from Библиотека программиста | программирование, кодинг, разработка
Please open Telegram to view this post
VIEW IN TELEGRAM
😁19👍3🌚1
🍴 Что происходит при копировании std::array?

Казалось бы, простой вопрос. Но копирование array работает совсем не так, как у vector.

Проблема: в C++ массивы не копируются обычным =. Но std::array копируется. Как?

⚡️ Ключевое отличие: std::array — это агрегатный тип, а агрегаты копируются поэлементно.

std::array<int, 3> a = {1, 2, 3};
std::array<int, 3> b = a; // Копируются ВСЕ элементы!


Под капотом компилятор генерирует:

b._data[0] = a._data[0];
b._data[1] = a._data[1];
b._data[2] = a._data[2];


❗️ Важно: это происходит на этапе компиляции. Для array<int, 1000> будет сгенерировано 1000 операций присваивания. Или одна memcpy, если компилятор умный.

Ловушка: копирование большого array может быть дорогим. В отличие от vector (копируется только указатель при move), array всегда копирует данные целиком.

Практический вывод: передавайте большие array по ссылке (const std::array<T, N>&), иначе каждый вызов функции скопирует все N элементов.

Библиотека C/C++ разработчика

#под_капотом
Please open Telegram to view this post
VIEW IN TELEGRAM
🙏4👍3
This media is not supported in your browser
VIEW IN TELEGRAM
🥱1
😵‍💫 Усиль свои позиции на собесе в Data Science знаниями математики!

Чем важна математика расскажет Мария Тихонова - кандидат компьютерных наук, руководитель исследовательского направления SberAI, доцент факультета компьютерных наук и преподаватель НИУ ВШЭ на курсе «Математика для Data Science» от Proglib Academy.

👀 Мария - человек, который реально работает с LLM и делает так, чтобы модели понимали человеческую речь, а не делали вид.

📌 Добавь в свое портфолио проект, выделись среди конкурентов

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

Бонусы:
- скидка 40% до 30 ноября
- если оплатить до конца ноября, получите курс «Базовая математика» в подарок

➡️ Пройти бесплатный тест на знание математики

👇👇👇
Записаться на курс
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1
🍕 include-what-you-use — очистка include директив

Ваш файл включает половину стандартной библиотеки, а использует только std::vector?


IWYU (include-what-you-use) — инструмент от Google, который анализирует какие заголовочные файлы реально используются и предлагает минимальный набор includes. Ускоряет компиляцию и делает зависимости явными.


🍴 Установка:

# Ubuntu
sudo apt install iwyu

# Из исходников с нужной версией clang
git clone https://github.com/include-what-you-use/include-what-you-use.git



✏️ Использование:

# Анализ файла
include-what-you-use main.cpp

# С применением исправлений
include-what-you-use main.cpp 2>&1 | fix_includes.py

# Для всего CMake проекта
cmake -DCMAKE_CXX_INCLUDE_WHAT_YOU_USE=include-what-you-use ..



❗️ Основные проблемы, которые находит:

• Лишние includes — файлы, которые не используются
• Транзитивные includes — зависимости через другие заголовки
• Forward declarations — где можно заменить include на forward decl
• Неполные includes — когда используется тип, но не включён его заголовок


✏️ Github

Библиотека C/C++ разработчика

#под_капотом
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍1