Библиотека C/C++ разработчика | cpp, boost, qt
Все самое полезное для плюсовика и сишника в одном канале. Как запустить своего ии-агента: https://clc.to/tvpmDQ По рекламе: @proglib_adv Для обратной связи: @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 17 155 subscribers, ranking 7 716 in the Technologies & Applications category and 39 185 in the Russia region.
📊 Audience metrics and dynamics
Since its creation on невідомо, the project has demonstrated rapid growth, gathering an audience of 17 155 subscribers.
According to the latest data from 23 June, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -16 796 over the last 30 days and by 0 over the last 24 hours, overall reach remains high.
- Verification status: Not verified
- Engagement rate (ER): The average audience engagement rate is 8.89%. Within the first 24 hours after publication, content typically collects 5.11% reactions from the total number of subscribers.
- Post reach: On average, each post receives 1 525 views. Within the first day, a publication typically gains 877 views.
- Reactions and interaction: The audience actively supports content: the average number of reactions per post is 5.
- 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:
“Все самое полезное для плюсовика и сишника в одном канале.
Как запустить своего ии-агента: https://clc.to/tvpmDQ
По рекламе: @proglib_adv
Для обратной связи: @proglibrary_feeedback_bot
РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17
#WXS...”
Thanks to the high frequency of updates (latest data received on 24 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.
struct Person {
std::string name;
int age;
double height;
};
std::vector<Person> people = {
{"Алиса", 30, 165},
{"Борис", 25, 180},
{"Виктор", 35, 175},
};
🤠 Одна структура — много ключей
Вся прелесть в том, что один и тот же контейнер крутим по любому полю — меняем только &Person::поле:
// по возрасту
std::ranges::sort(people, std::less{}, &Person::age);
// Борис(25), Алиса(30), Виктор(35)
// самый высокий
auto tallest = std::ranges::max_element(people, std::less{}, &Person::height);
std::cout << tallest->name; // Борис
// найти по имени
auto found = std::ranges::find(people, "Алиса", &Person::name);
std::cout << found->age; // 30
Указатель &Person::age годится в проекции, потому что алгоритм зовёт её через std::invoke, а тот превращает его в p.age. Проекцией может быть что угодно вызываемое.
Заметьте: max_element и find вернули итератор на целого Person. Проекция выбирает ключ, но на выходе всегда исходный элемент.
‼️ sort сортирует на месте. Гоняете сниппеты подряд по одному people — каждый следующий видит уже переставленный вектор (max_element/find это не волнует).
👑 Компаратор + проекция = направление + ключ
Проекция говорит «по какому полю», компаратор — «в каком порядке»:
// по убыванию роста
std::ranges::sort(people, std::greater{}, &Person::height);
// Борис(180), Виктор(175), Алиса(165)
std::less → std::greater — перевернули порядок, поле не трогали.
Компаратор можно сократить до {}, но не выбросить совсем:
std::ranges::sort(people, {}, &Person::age); // ок
std::ranges::sort(people, &Person::age); // не компилируется
Проекция — третий аргумент, поэтому без компаратора &Person::age уедет в его слот. {} этот слот занимает и подставляет дефолт — а дефолт тут std::ranges::less, не std::less (на наших данных без разницы).
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#константная_правильностьx«AI-инструменты в разработке: пишем код быстрее»Мы покажем живой разбор реального проекта: как с помощью AI-ассистентов мгновенно разбираться в чужой кодовой базе, искать нужные участки и собирать Pull Request. Только рабочие промпты, которые сэкономят вам часы рутины. 🎙 Спикер — Ольга Лукьянова, руководитель команды в SourceCraft (18+ лет развивала инструменты в JetBrains и Huawei). 👉 Узнать, как ускорить разработку с AI
lock-free структурах
• doctest: тесты прямо рядом с кодом — способ написания unit-тестов прямо в файле с бизнес логикой
📙 Ranges:
• Проекции: Что такое проекция?
🔹📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#свежакstd::thread, что-то делает и в конце — terminate() и аварийное завершение всего приложения. Без единого явного throw в коде.
void DoWork(bool earlyExitCondition) {
std::thread worker([]() {
Sleep(2000);
std::cout << "Done\n";
});
if (earlyExitCondition) {
return; // worker все ещё joinable!
}
worker.join();
}
Задача: объясни, почему деструктор std::thread вызывает std::terminate, если поток всё ещё joinable, и предложи паттерн, который защищает от этого на всех путях выхода из функции, включая исключения.
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#междусобойчикelse просто как угрозу компилятору — чтобы он точно выполнил этот if, а не то...»
В обычном английском фраза «or else» означает угрозу — «а не то...» / «а иначе пожалеешь»
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#развлекаловоDOCTEST_CONFIG_DISABLE все тесты вырезаются из релизного бинарника полностью.
Такой подход меняет привычку: проверку можно положить сразу под функцию, пока логика свежа в голове. Тест становится живой документацией, а не отдельным проектом в папке tests/.
int add(int a, int b) { return a + b; }
TEST_CASE("add") { CHECK(add(2, 2) == 4); }
✏️ Держите ли вы тесты отдельно от кода — или допускаете их соседство в одном файле?
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#константная_правильностьx«Мультиагентные системы: почему большинство архитектур переусложнены»🔥 За 90 минут разберёмся, когда действительно стоит строить мультиагентную систему, а когда она только добавляет сложность, расходы и новые точки отказа. Поговорим о критериях выбора архитектуры, типичных ошибках и ограничениях современных ИИ-агентов, которые важно учитывать ещё до внедрения в продукт. 🎙️ Спикер — Дмитрий Юдин, руководитель AI/ML-направления в Сloud․ru. 🎁 Для всех участников подготовили промокод на скидку 10 000 ₽ на курс «Разработка ИИ-агентов». 👉 Успей присоединиться к уроку
lock-free структурах: почему нельзя просто delete узел, который кто-то ещё держит.
• Гонка: X взял указатель на вершину и уснул, Y удалил узел, X читает по освобождённому адресу. UB
• ABA: аллокатор переиспользует адрес, CAS видит «тот же» указатель и возвращает мёртвое значение. Развал структуры
• Идея: поток публикует адрес в атомарный hp_ptr. Пока опубликован — узел не удаляют
• Удаление откладывается: кандидаты копятся в retired_list, реальный delete идёт позже, в фазе scan
Scan собирает все активные hp_ptr под shared_mutex, сортирует и бинарным поиском проверяет кандидатов. Нет в активных — deleter вызывается.
👉 Разбор
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#свежакstd::ranges принимают необязательный параметр proj; по умолчанию там std::identity — элемент идёт как есть.
⏰ ranges::sort — сортировка по полю
Возьмём те самые задачи из прошлого поста:
struct Task { std::string name; int priority; };
std::vector<Task> tasks = { {"Код", 1}, {"Деплой", 3}, {"Тесты", 2} };
std::ranges::sort(tasks, {}, &Task::priority);
// порядок: Код(1), Тесты(2), Деплой(3)
Здесь {} — компаратор по умолчанию (ranges::less), а &Task::priority — проекция. Для каждой пары алгоритм считает less(a.priority, b.priority). Помните, в свёртках, чтобы сложить по priority, пришлось писать лямбду? Тут поле достаёт сама проекция.
🎨 Проекция по указателю на член
Самый частый случай — &Тип::поле. И работает не только в sort:
// найти задачу с priority == 3
auto it = std::ranges::find(tasks, 3, &Task::priority);
// *it == Task{"Деплой", 3}
// посчитать задачи с priority > 1
auto n = std::ranges::count_if(tasks,
[](int p){ return p > 1; }, &Task::priority);
// n == 2
Обратите внимание на порядок: у find проекция идёт сразу после искомого значения (компаратора у него нет), а у count_if — после предиката. У каждого алгоритма свой набор параметров, проекция в нём всегда последняя.
🧁 Проекцией может быть что угодно вызываемое
Не только поле. Подойдёт указатель на метод, лямбда, свободная функция — всё, что переваривает std::invoke:
std::vector<std::string> v = {"apple", "fig", "banana"};
std::ranges::sort(v, {}, &std::string::size); // по длине
// "fig"(3), "apple"(5), "banana"(6)
std::vector<int> nums = {-5, 2, -1, 3};
std::ranges::sort(nums, {}, [](int x){ return std::abs(x); }); // по модулю
// -1, 2, 3, -5
🎁 Проекция меняет ВЗГЛЯД, но не результат
Это главное, что надо уложить в голове. Проекция влияет только на то, ПО ЧЕМУ алгоритм принимает решения. Возвращает он по-прежнему исходные элементы, а не спроецированные значения:
auto top = std::ranges::max(tasks, {}, &Task::priority);
// top — это Task{"Деплой", 3}, а НЕ число 3
// (и это копия: max возвращает элемент по значению)
auto it = std::ranges::min_element(tasks, {}, &Task::priority);
// *it — Task{"Код", 1}, итератор на сам элемент (копии нет)
То есть проекция — это «по какому ключу», а не «во что превратить». Если нужно именно превратить элементы — это уже views::transform.
🍕 У бинарных алгоритмов проекций две
Там, где сравниваются два диапазона (equal, mismatch, …), проекций тоже две — по одной на каждый вход:
std::vector<Task> a = { {"X", 1}, {"Y", 2} };
std::vector<Task> b = { {"A", 1}, {"B", 2} };
// равны ли списки по приоритетам, игнорируя имена?
bool same = std::ranges::equal(a, b, {}, &Task::priority, &Task::priority);
// {} — предикат по умолчанию, дальше proj1 и proj2
// true: 1 == 1, 2 == 2
‼️ Несколько подводных камней
• Порядок аргументов. proj идёт после компаратора, а не вместо. sort(tasks, &Task::priority) — указатель на поле не годится в компараторы → простыня ошибок. Правильно: sort(tasks, {}, &Task::priority).
• Проекцию зовут много раз. В sort — на каждом сравнении, O(n log n) вызовов. Тяжёлую (парсит строку) выгоднее посчитать заранее и сортировать по готовым ключам.
• Проекция ≠ преобразование вывода. На выходе всегда исходные элементы. Превратить их — это views::transform.
• Свёртки без проекций. У fold_* параметра proj нет (хотя у for_each и transform есть). «Свернуть по полю» — только лямбдой или через views::transform.
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#константная_правильностьxEXPECT_DEATH(stmt, "regex"), фреймворк форкает текущий процесс. Дочерний выполняет stmt, родитель через waitpid() ждёт его завершения и анализирует статус выхода.
❓ Зачем вообще отдельный процесс? Потому что abort(), std::terminate или сработавший assert убивают процесс по-настоящему. Поймать это в том же процессе как исключение нельзя — управление уже не вернётся. Единственный способ протестировать смерть, не убив сам тест-раннер, — изолировать её в ребёнке.
EXPECT_DEATH(
{ std::abort(); },
".*"
);
❗️ Родитель и ребёнок после форка — два независимых адресных пространства (copy-on-write). Краш в ребёнке для родителя — просто ненулевой код возврата или сигнал.
❗️Death-тест — это не try/catch, это управляемое самоубийство подпроцесса. Если держать это в голове, перестаёшь удивляться, почему std::cout внутри блока ведёт себя странно.
❓ А вы проверяете abort()-ветки или оставляете их «на авось»?
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#константная_правильность
Available now! Telegram Research 2025 — the year's key insights 
