en
Feedback
Библиотека C/C++ разработчика | cpp, boost, qt

Библиотека C/C++ разработчика | cpp, boost, qt

Open in Telegram

Все самое полезное для плюсовика и сишника в одном канале. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/d6cd2932 Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17 #WXSSA

Show more

📈 Analytical overview of Telegram channel Библиотека C/C++ разработчика | cpp, boost, qt

Channel Библиотека C/C++ разработчика | cpp, boost, qt (@cppproglib) in the Russian language segment is an active participant. Currently, the community unites 23 197 subscribers, ranking 5 865 in the Technologies & Applications category and 28 975 in the Russia region.

📊 Audience metrics and dynamics

Since its creation on невідомо, the project has demonstrated rapid growth, gathering an audience of 23 197 subscribers.

According to the latest data from 04 June, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -10 788 over the last 30 days and by 7 over the last 24 hours, overall reach remains high.

  • Verification status: Not verified
  • Engagement rate (ER): The average audience engagement rate is 6.99%. Within the first 24 hours after publication, content typically collects 4.12% reactions from the total number of subscribers.
  • Post reach: On average, each post receives 1 622 views. Within the first day, a publication typically gains 957 views.
  • Reactions and interaction: The audience actively supports content: the average number of reactions per post is 9.
  • Thematic interests: Content is focused on key topics such as c++, навигация, компилятор, удалёнка, developer.

📝 Description and content policy

The author describes the resource as a platform for expressing subjective opinions:
Все самое полезное для плюсовика и сишника в одном канале. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/d6cd2932 Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17 #WXSSA

Thanks to the high frequency of updates (latest data received on 05 June, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.

23 197
Subscribers
+724 hours
-10 7467 days
-10 78830 days
Posts Archive
🦾 Почему ваши AI-продукты на базе LLM ломаются (и как это чинить)? Выкатили ИИ-фичу в прод, а она галлюцинирует, падает или
🦾 Почему ваши AI-продукты на базе LLM ломаются (и как это чинить)? Выкатили ИИ-фичу в прод, а она галлюцинирует, падает или выдает мусор? Приглашаем на открытый вебинар, где разберем реальную боль внедрения LLM-агентов и научимся делать так, чтобы «всё работало». 🗓️ Когда: 7 мая в 19:00 МСК ⏱️ Формат: 60 минут мяса + 30 минут ответов на ваши вопросы 🧑🏻‍💻 Кто вещает: Эмиль Сатаев — Backend Platform Developer (8+ лет в разработке). Человек, который своими руками внедряет LLM и агентные системы в реальные коммерческие сервисы. 🎁 Главный бонус для онлайна: Только участникам прямого эфира подарим уникальный промокод на скидку 10.000 ₽ на большой курс AgentOps. 👉 Занять место на вебинаре

Что делает auto(x) в C++23?
Anonymous voting

🏛️ oo-alloc — пользовательские аллокаторы Написать аллокатор в C++ несложно. Написать его правильно — уже интереснее. oo-all
🏛️ oo-alloc — пользовательские аллокаторы Написать аллокатор в C++ несложно. Написать его правильно — уже интереснее. oo-alloc предлагает объектно-ориентированную модель поверх низкоуровневого управления памятью. • Проблема std::allocator: шаблон привязан к типу, его сложно использовать совместно для разных типов в одном контексте • Иерархия классов даёт полиморфизм через интерфейс, но добавляет косвенный вызов через таблицу виртуальных функций — и авторы это понимают • Выделение памяти через пул снижает нагрузку на кучу и устраняет фрагментацию при объектах фиксированного размера Альтернатива из стандарта — std::pmr::polymorphic_allocator с memory_resource. Тот же полиморфизм, но без overhead своей иерархии и с поддержкой в STL-контейнерах из коробки. Если нужен production-grade вариант — сначала смотреть туда. 👉 Github 🖍️ Стоит ли вообще писать кастомный аллокатор в 2026, когда есть pmr? 📍 Навигация: ВакансииЗадачиСобесы Библиотека C/C++ разработчика #буст

📰 Свеженькое из мира C++ Подготовили подборку самых интересных материалов за неделю о разных аспектах программирования и инт
📰 Свеженькое из мира C++ Подготовили подборку самых интересных материалов за неделю о разных аспектах программирования и интересных проектах в мире C++. 😎 Интересное:Минималистичная настройка редактора Zed — плейлист с настройкой редактора Zed для минималистов • Vtable изнутри — разбор устройства таблиц виртуальных функций • Деревья в алгоритмах — гайд по иерархическим структурам • Бесплатные курсы от MIT — университетские курсы по shell, git и др. • Иерархический FSM — разбор способа решения проблемы состояний • GCC 16: наконец-то читаемые ошибки компилятора — обзор улучшений обработки и вывода ошибок • Улучшения string и string_view в C++26, о которых давно мечтали — исправление костылей string_view 📙 Ranges: C++ Ranges. Требования к диапазонамstd::views::filter — ленивая фильтрация в C++20 views::transform — ленивые преобразования в C++20views::take и views::drop — срезы в C++ 🔹📍Навигация: ВакансииЗадачиСобесы Библиотека C/C++ разработчика #свежак

🏆 Задача на выходные: string_view vs string в API Перед тобой два варианта API логгера. Выбери лучший и обоснуй. Нет единственно верного ответа — важна аргументация.
#include <string>
#include <string_view>

// Вариант А
class LoggerA {
public:
    void log(const std::string& msg);
    void setPrefix(const std::string& prefix);
    std::string getLastMessage() const;
};

// Вариант Б
class LoggerB {
public:
    void log(std::string_view msg);
    void setPrefix(std::string_view prefix);
    std::string_view getLastMessage() const;
};

// Контекст использования:
// 1. log() вызывается тысячи раз в секунду
// 2. setPrefix() — один раз при старте
// 3. getLastMessage() — для диагностики
// 4. Логгер хранит последнее сообщение внутри
✏️ Напиши в комментариях: какой метод в каком варианте правильный, а какой — нет. Предложи «идеальный» LoggerC. 📍Навигация: ВакансииЗадачиСобесы Библиотека C/C++ разработчика #константная_правильность

📉 Кризис найма в IT: почему Яндекс и Сбер усложняют собеседования вместо того, чтобы их упрощать Казалось бы, если кандидато
📉 Кризис найма в IT: почему Яндекс и Сбер усложняют собеседования вместо того, чтобы их упрощать Казалось бы, если кандидатов не хватает — надо снижать барьеры. Но крупные игроки делают ровно наоборот: добавляют этапы, тесты и ИИ-оценку. За этим стоит холодная логика: лучше закрывать вакансию дольше, чем нанять человека, который уйдет через полгода. Смотрим, что именно изменилось в Яндексе и Сбере — и работает ли это. 👉 Статья 📍Навигация: ВакансииЗадачиСобесы Библиотека C/C++ разработчика #буст

🍙 views::take и views::drop — срезы в C++ Если views::transform превращает элементы, то views::take и views::drop управляют тем, сколько элементов обработать. Та же ленивая логика, никакого лишнего копирования. 🌸 views::take — первые N элементов
#include <ranges>
#include <vector>
namespace views = std::views;

std::vector<int> v = {10, 20, 30, 40, 50};

auto first_three = v | views::take(3);
// При итерации: 10, 20, 30
Лямбда не нужна — достаточно числа. Адаптер остановит итерацию сам, как только наберёт нужное количество. 🍪 take_while — берём пока условие истинно
auto while_lt_40 = v | views::take_while([](int x) { return x < 40; });
// При итерации: 10, 20, 30
В отличие от take(n), здесь количество элементов заранее неизвестно — решает предикат. 🍀 views::drop — пропустить первые N элементов
auto skip_two = v | views::drop(2);
// При итерации: 30, 40, 50

// drop_while — пропускаем пока условие истинно
auto after_twenties = v | views::drop_while([](int x) { return x <= 20; });
// При итерации: 30, 40, 50
❗️Важный нюанс: drop_while проверяет предикат только до первого несовпадения, а затем отдаёт все оставшиеся элементы подряд — даже те, что снова удовлетворили бы условию. Это не фильтр — это одноразовый пропуск. 🌱 Срез в середине: drop + take Комбинируя два адаптера, получаем аналог Python-срезов:
// Элементы с индекса 1 по 3 включительно (аналог v[1:4])
auto slice = v | views::drop(1) | views::take(3);
// При итерации: 20, 30, 40
Весь конвейер по-прежнему ленив: элементы не вычисляются до начала итерации. 🍙 Связка с filter и transform
struct Employee {
    std::string name;
    double salary;
    bool is_active;
};

std::vector<Employee> employees = { /* ... */ };

// Топ-2 активных сотрудника по имени
auto top_two = employees
    | views::filter([](const Employee& e) { return e.is_active; })
    | views::transform([](const Employee& e) { return e.name; })
    | views::take(2);
Ловушка: drop на бесконечном диапазоне
// OK — take ограничивает бесконечный iota
auto ok = std::views::iota(1) | std::views::take(5);
// 1, 2, 3, 4, 5

// OK — drop сам по себе безопасен, view создаётся без проблем
auto dropped = std::views::iota(1) | std::views::drop(3);

// ОПАСНО — итерирование без терминатора зависнет навсегда
for (auto x : dropped) { /* никогда не остановится */ }
drop на бесконечном диапазоне создаётся без проблем. Опасность — в цикле без ограничителя. Всегда добавляйте take или аналог, если диапазон потенциально бесконечен. 🐸 Продолжение следует... 📍Навигация: ВакансииЗадачиСобесы Библиотека C/C++ разработчика #константная_правильность

😎 Улучшения string и string_view в C++26, о которых давно мечтали string_view появился в C++17 как замена const string&. Но
😎 Улучшения string и string_view в C++26, о которых давно мечтали string_view появился в C++17 как замена const string&. Но кое-где он всё равно требовал лишних костылей. C++26 наконец это чинит без критических изменений. 📎 Что изменилось:stringstream + string_view (P2495R3) Раньше инициализировать stringstream из string_view можно было только через ручную конвертацию в string. Теперь — напрямую. • bitset + string_view (P2697R1) Та же история: конструктор bitset принимает string_view без лишней копии. Обходной путь через .data() был ещё и небезопасен из-за null-termination. • operator+ для string и string_view (P2591R5) Самое долгожданное. s + sv раньше просто не компилировалось — несмотря на то что s += sv работало. Причина: перегрузку придерживали для гипотетического string билдер, который так и не появился. Теперь наконец добавили свободные шаблонные функции. 👉 Подробнее тут Навигация: ВакансииЗадачиСобесы Библиотека C/C++ разработчика #линкер_рекомендует

🔥 4 привычки кодеров Вот сколько общаюсь с разработчиками, постоянно слышу убеждение, что есть какой-то правильный способ пи
🔥 4 привычки кодеров Вот сколько общаюсь с разработчиками, постоянно слышу убеждение, что есть какой-то правильный способ писать софт. Все ищут секретную архитектуру, вылизывают паттерны, чтобы хоба и тимлид заплакал от счастья от твоего идеального кода. но, я собрал 4 привычки адептов «чистого кода», (которые обычно все практикуют) 🤡 • Бесконечный рефакторинг рабочего кода. Кажется, что так ты делаешь продукт лучше. Итог: жестко падаешь в перфекционизм. Переписываешь функцию по три раза, а бизнес ждет релиз. Закрываешь вкладку и в голове абсолютная пустота, время потрачено, а новых фичей ноль. • Упарывание в сложную архитектуру Сеньоры на ютубе обещают золотые горы, если внедрить микросервисы куда угодно. Итог: получаешь красивый overengineering-проект для мамы и 0 запущенных продуктов в срок, пока конкуренты клепают MVP на коленке. • Душные споры на ревью Неплохо, но как итог: ты пишешь полотна текста и тратишь часы на поиск глупой придирки к стилю, потому что банально фокус сместился с реальной задачи на эго. • Ручная микро-оптимизация Классика для тех, кто любит алгоритмы из универа. Итог: убиваешь дни жизни и выжимаешь миллисекунды, хотя бизнесу нужен был просто грязный, но рабочий скрипт еще вчера. Проблема в том, что ни один из этих путей не дает самого главного - скорости и проверки гипотез. Реальному рынку плевать на твой идеальный код за 3 дня. Бизнес предпочтет код от ИИ-агента за 5 минут, который уже завтра начнет приносить деньги. Хочешь обкатанный на нас лично и 100х учениках метод, как перестать кодить руками и начать делегировать задачи автономным системам? 👉 Заходи сюда, но у нас осталось всего 4 места, набор идет до завтрашнего дня. P. S. Если интересно еще что-нибудь почитать от меня, то заходите в «Азбуку Айтишника», там я рассказываю об айти-базе, также у меня там есть бесплатный гайд на 15 глав по ии-агентам

😎 Топ-вакансий для C++ разработчиков за неделю C++ red team developer — от 180 000 и до 450 000 ₽ Офис (Санкт-Петербург) C++ разработчик (CHYT) — Гибрид (Москва, Санкт-Петербург, Минск, Белград) Senior Rendering engineer C++ в 3D Карту — от 350 000 и до 400 000 ₽ Удалёнка/Гибрид (Санкт-Петербург, Москва) ✍️ Еще больше топовых вакансий — в нашем канале C++ jobs 📍Навигация: ВакансииЗадачиСобесы Библиотека C/C++ разработчика #буст

🔒 Планы hh.ru на 2026: привязка к Госуслугам и запрет накрутки опыта С 2026 года hh.ru делит соискателей на три категории: в
🔒 Планы hh.ru на 2026: привязка к Госуслугам и запрет накрутки опыта
С 2026 года hh.ru делит соискателей на три категории: верифицированные, «серые» и невидимые. Те, кто не привязал Госуслуги и не подтвердил опыт через ЭТК, рискуют отправлять отклики в пустоту.
Разбираем механику новой системы и даем рабочий план — что делать прямо сейчас, чтобы остаться в игре. 👉 Читать статью 🐸 Библиотека программиста

🗓️ Уже через пару часов стартует вебинар! Тема:
Как эффективно управлять контекстным окном LLM в мультиагентных системах и не сливать бюджет на токены
Ждем вас сегодня в 19:00 по московскому времени. Не пропустите начало, будет много практики! 👉 Успей занять место

GCC 16: наконец-то читаемые ошибки компилятора C++ и нечитаемые ошибки компилятора — классика жанра. GCC 16 делает шаг в стор
GCC 16: наконец-то читаемые ошибки компилятора C++ и нечитаемые ошибки компилятора — классика жанра. GCC 16 делает шаг в сторону человекочитаемости. • Иерархическое отображение диагностик теперь включено по умолчанию (в GCC 15 это был экспериментальный флаг). • Несовпадение сигнатур больше не требует детективного расследования. Если параметр 3 — void* вместо const void*, компилятор ткнёт в конкретную строку. • SARIF-вывод вырос: вложенные logicalLocations с полным путём namespace → class → function. • Появился -fdiagnostics-add-output=experimental-html — HTML с подсветкой кода и визуализацией стека. -fanalyzer наконец понимает C++: exception handling и NRVO реализованы. Честно: на большой кодовой базе анализатор тихо капитулирует. Для проода — ещё не подходит. 👉 Полный разбор 🤖 Осталось 4 места на курс по ИИ-агентам. Набор закрывается 30 апреля. 🔗 Успеть на обучение 📍Навигация: ВакансииЗадачиСобесы Библиотека C/C++ разработчика #свежак

🍙 views::transform — ленивые преобразования в C++20 Если views::filter решает, какие элементы обработать, то views::transform — во что их превратить. Никакого копирования: это такая же ленивая обёртка над данными. 🌸 Базовое использование
#include <ranges>
#include <vector>
#include <string>
namespace views = std::views;

std::vector<std::string> words = {"hello", "world", "cpp"};

// Получаем длины слов
auto lengths = words | views::transform([](const std::string& s) {
    return s.size();
});
// При итерации: 5, 5, 3
Лямбда применяется к каждому элементу в момент итерации — ни раньше, ни позже. 🍪 Трансформация с изменением типа transform не обязан возвращать тот же тип. Из string можно получить size_t, из doubleint, из структуры — одно из её полей:
// Верхний регистр (#include <cctype>)
auto upper = words | views::transform([](std::string s) {
    for (char& c : s) c = std::toupper(c);
    return s;
});
// При итерации: "HELLO", "WORLD", "CPP"
Обратите внимание: здесь s принимается по значению — это намеренная копия, которую мы модифицируем. 🍀 filter + transform — классика Главная сила адаптеров — в их цепочке. Сначала отсеиваем ненужное, потом преобразуем то, что осталось:
struct Employee {
    std::string name;
    double salary;
    bool is_active;
};

std::vector<Employee> employees = {
    {"Алиса",  80000,  true},
    {"Борис",  95000,  false},
    {"Виктор", 72000,  true},
    {"Галина", 110000, true},
};

// Имена активных сотрудников с зарплатой выше 75 000
auto high_earners = employees
    | views::filter([](const Employee& e) { return e.is_active; })
    | views::filter([](const Employee& e) { return e.salary > 75000; })
    | views::transform([](const Employee& e) { return e.name; });

for (const auto& name : high_earners) {
    std::cout << name << "\n"; // Алиса, Галина
}
Весь конвейер ленив: ни одна лямбда не вызывается, пока не начнётся итерация. 🌱 pipe-синтаксис vs явный тип
auto v1 = words | views::transform([](const std::string& s) { return s.size(); });
auto v2 = std::ranges::transform_view{words, [](const std::string& s) { return s.size(); }};
🍙 Материализация в вектор transform_view — не контейнер. Чтобы получить std::vector, нужно явно материализовать:
// C++23
auto vec = words | views::transform([](const std::string& s) { return s.size(); })
                 | std::ranges::to<std::vector>();

// C++20
std::vector<size_t> vec(lengths.begin(), lengths.end());
Ловушка: несовпадение типа возврата
// UB — возвращается ссылка на временный объект
auto bad = words | views::transform([](const std::string& s) -> const std::string& {
    std::string upper = s;
    return upper; // dangling reference!
});

// Правильно — возвращаем по значению
auto ok = words | views::transform([](const std::string& s) {
    std::string upper = s;
    for (char& c : upper) c = std::toupper(c);
    return upper;
});
🐸 Продолжение следует... 📍Навигация: ВакансииЗадачиСобесы Библиотека C/C++ разработчика #константная_правильность

🍿 Иерархический FSM (HFSM) FSM (конечный автомат) — это не rocket science. Это просто способ явно описать: «в каком состоянии я нахожусь» и «что происходит при событии X». Пригодится везде: парсеры протоколов, UI-логика, игровые NPC, сетевые соединения. Самая простая реализация — enum + switch и в большинстве случаев этого может быть достаточно. Но, если состояний становится много, то пользоваться им становится не удобно и самое время задуматься об иерархическом автомате. HFSM позволяет группировать состояния. Применяется в игровых движках (вложенные состояния NPC), UI-фреймворках, протоколах с retry-логикой. 🧋 Реализация
#include <iostream>
#include <functional>
#include <map>
#include <optional>

enum class State { Idle, Running, Paused, Active, Stopped };
enum class Event { Start, Pause, Resume, Stop };

// Состояние может иметь родителя — тогда необработанные события
// делегируются вверх по иерархии
struct StateNode {
    std::optional<State>  parent;
    std::function<void()> onEnter;
    std::function<void()> onExit;
};

class HierarchicalFSM {
    State current_;
    std::map<State, StateNode>                 nodes_;
    std::map<std::pair<State,Event>, State>    transitions_;

public:
    explicit HierarchicalFSM(State init) : current_(init) {}

    void defState(State s,
                  std::optional<State> parent = std::nullopt,
                  std::function<void()> enter = {},
                  std::function<void()> exit  = {}) {
        nodes_[s] = {parent, std::move(enter), std::move(exit)};
    }

    void addTransition(State from, Event ev, State to) {
        transitions_[{from, ev}] = to;
    }

    bool process(Event ev) {
        // Ищем переход от текущего состояния вверх по иерархии
        std::optional<State> search = current_;
        while (search) {
            auto it = transitions_.find({*search, ev});
            if (it != transitions_.end()) {
                exitState(current_);
                current_ = it->second;
                enterState(current_);
                return true;
            }
            // Поднимаемся к родителю
            auto nodeIt = nodes_.find(*search);
            search = (nodeIt != nodes_.end()) ? nodeIt->second.parent
                                               : std::nullopt;
        }
        return false; // переход не найден
    }

    State state() const { return current_; }

private:
    void enterState(State s) {
        if (auto it = nodes_.find(s); it != nodes_.end())
            if (it->second.onEnter) it->second.onEnter();
    }
    void exitState(State s) {
        if (auto it = nodes_.find(s); it != nodes_.end())
            if (it->second.onExit) it->second.onExit();
    }
};

int main() {
    HierarchicalFSM fsm(State::Idle);

    // Active — виртуальный родитель для Running и Paused
    fsm.defState(State::Active);
    fsm.defState(State::Idle);
    fsm.defState(State::Running, State::Active,
        [] { std::cout << "[ENTER] Running\n"; },
        [] { std::cout << "[EXIT]  Running\n"; });
    fsm.defState(State::Paused, State::Active);
    fsm.defState(State::Stopped, std::nullopt,
        [] { std::cout << "[ENTER] Stopped\n"; });

    fsm.addTransition(State::Idle, Event::Start, State::Running);
    fsm.addTransition(State::Running, Event::Pause, State::Paused);
    fsm.addTransition(State::Paused, Event::Resume, State::Running);
    // Stop работает из любого Active-состояния
    fsm.addTransition(State::Active, Event::Stop, State::Stopped);

    fsm.process(Event::Start);
    fsm.process(Event::Pause);
    fsm.process(Event::Stop); // делегируется к Active -> Stopped
    return 0;
}
❗️ Добавь состояние — и оно автоматически наследует все переходы родителя. Не нужно дублировать Stop в каждое дочернее состояние. ✏️ Используешь FSM в продакшне? 🔥 Успейте на курс по ИИ-агентам! До 30 апреля осталось всего 4 места. 👉 Занять место по ссылке 📍Навигация: ВакансииЗадачиСобесы Библиотека C/C++ разработчика #шаблонный_код

Что выведет следующий код?
Anonymous voting

Библиотека C/C++ разработчика | cpp, boost, qt - Statistics & analytics of Telegram channel @cppproglib