Библиотека C/C++ разработчика | cpp, boost, qt
Все самое полезное для плюсовика и сишника в одном канале. По рекламе: @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.
oo-alloc предлагает объектно-ориентированную модель поверх низкоуровневого управления памятью.
• Проблема std::allocator: шаблон привязан к типу, его сложно использовать совместно для разных типов в одном контексте
• Иерархия классов даёт полиморфизм через интерфейс, но добавляет косвенный вызов через таблицу виртуальных функций — и авторы это понимают
• Выделение памяти через пул снижает нагрузку на кучу и устраняет фрагментацию при объектах фиксированного размера
Альтернатива из стандарта — std::pmr::polymorphic_allocator с memory_resource. Тот же полиморфизм, но без overhead своей иерархии и с поддержкой в STL-контейнерах из коробки. Если нужен production-grade вариант — сначала смотреть туда.
👉 Github
🖍️ Стоит ли вообще писать кастомный аллокатор в 2026, когда есть pmr?
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#буст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++20
• views::take и views::drop — срезы в C++
🔹📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#свежак#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++ разработчика
#константная_правильность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_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++ разработчика
#линкер_рекомендуетС 2026 года hh.ru делит соискателей на три категории: верифицированные, «серые» и невидимые. Те, кто не привязал Госуслуги и не подтвердил опыт через ЭТК, рискуют отправлять отклики в пустоту.Разбираем механику новой системы и даем рабочий план — что делать прямо сейчас, чтобы остаться в игре. 👉 Читать статью 🐸 Библиотека программиста
Как эффективно управлять контекстным окном LLM в мультиагентных системах и не сливать бюджет на токеныЖдем вас сегодня в 19:00 по московскому времени. Не пропустите начало, будет много практики! 👉 Успей занять место
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 — во что их превратить. Никакого копирования: это такая же ленивая обёртка над данными.
🌸 Базовое использование
#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, из double — int, из структуры — одно из её полей:
// Верхний регистр (#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 (конечный автомат) — это не 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++ разработчика
#шаблонный_код
Available now! Telegram Research 2025 — the year's key insights 
