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

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

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

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

РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17

#WXSSA
Download Telegram
🛠 Бесплатные курсы от MIT

Университеты дают алгоритмы, OS, компиляторы — но не учат пользоваться инструментами, с которыми разработчик проводит большую часть рабочего времени. MIT решили это исправить.

• Курс покрывает shell, профилирование, отладку, git и упаковку кода — всё то, что обычно осваивается методом тыка в первые годы работы.
• В версии 2026 добавлен модуль по agentic coding: как встраивать AI-инструменты в реальный рабочий процесс, не теряя контроль над кодом.
• Отдельный акцент на качестве кода — тема, которая в академической среде почти не появляется
• Лекции доступны на YouTube, материалы открыты, есть переводы на 17 языков включая русский.


🍬 The Missing Semester of Your CS Education (eng)

🍬 Пропущенный семестр курса по компьютерным наукам (рус)


✏️ Что из этого списка вы осваивали самостоятельно, а не на работе или учёбе?


📍 Навигация: ВакансииЗадачиСобесы

Библиотека питониста

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
5😁1
🩹 Задача на выходные: const-итерация по Range

#include <ranges>
#include <vector>

void process(const auto& view) {
for (auto x : view) { (void)x; }
}

int main() {
std::vector<int> data = { 1, 2, 3, 4, 5 };
auto pred = [](int x) {
return x % 2 == 0;
};

auto filtered = data | std::views::filter(pred);
process(filtered); // не компилируется
}


Объясни механизм: почему begin() const невозможен в принципе, а не по недосмотру комитета.


📍Навигация:
ВакансииЗадачиСобесы

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

#междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍205❤‍🔥203🤩202🥰191😁1
🔥 База по ИИ-агентам от научного сотрудника Сколтеха и НИУ ВШЭ

Знакомьтесь, Екатерина Трофимова. Кандидат компьютерных наук, ресерчер в Центре ИИ Сколтеха и лаборатории LAMBDA. Она объединяет глубокую академическую экспертизу и практику: знает, как ИИ-системы устроены «под капотом» и как встроить их в реальные проекты (в т.ч. для Т-банка).

Мы попросили Екатерину собрать список мастхев материалов для тех, кто хочет проектировать агентов в проде. Сохраняйте список.

🛠 Стек и фреймворки:

DSPy — алгоритмическая оптимизация промптов (вместо ручного подбора слов).

Semantic Kernel и LangMem — инструменты для управления сессионной и долгосрочной памятью.

MCP (Model Context Protocol) — новый стандарт от Anthropic для подключения агентов к вашим БД и локальным файлам.

📖 Документация, которую нужно знать:

Anthropic Prompt Caching — как кэшировать контекст и радикально резать косты на API.

OpenAI Agents SDK / Cookbook — лучшие практики работы с памятью.

Augment — платформа для оптимизации работы ИИ-агентов и контроля токенов.

🔬 Хардкорные статьи и препринты (на выходные):

Lost in the Middle — почему LLM «слепнут» на длинных текстах и забывают середину контекста.

How Do Coding Agents Spend Your Money? — куда улетает бюджет при работе автономных кодинг-агентов.

MemGPT — архитектура операционной системы для LLM с иллюзией бесконечной памяти.

InjecAgent / AgentSentry — всё о безопасности и защите агентов от инъекций в промпты.

Екатерина Трофимова — один из ключевых экспертов нашего курса AgentOps. На своих лекциях она детально разбирает, как проектировать инструменты для агентов, как агент принимает решения о вызове инструментов и какие ограничения возникают в реальном проде

🎁 Акция в честь старта продаж!

Прямо сейчас при покупке Инженерного трека вы получаете полный доступ к материалам курса «Разработка ИИ-агентов» в подарок.

👉 Забрать 2 курса по цене 1 и начать обучение
❤‍🔥214🔥202🥰198👍189😁1
⚙️ Хотим сделать одну вещь — собрать нормальный список людей, за которыми реально следит C++ сообщество

C++ — язык с историей. И у него есть живое сообщество людей, которые двигают его вперёд — через доклады, статьи, открытый код и просто посты в сети.

⁉️ Хотим узнать, кого читаете именно вы

Не «обязательный список» — а реальный срез того, за кем следит наш канал. Может, откроем друг другу что-то новое.

📎 Формат простой:

• Имя
• Где (YouTube, блог, X, GitHub...)
• Почему именно он/она

👇 Пишите, собирём в отдельный пост

📍Навигация: ВакансииЗадачиСобесы

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

#междусобойчик
296👍289💯257🥱3😁1
🍴 Умные указатели в Qt: почему new никуда не делся

Современный C++ давно говорит «забудь про new». Qt говорит «подожди». Статья разбирает, почему иерархическая модель фреймворка и RAII плохо живут вместе.

QObject с родителем удаляется деструктором родителя. Если при этом он ещё и под unique_ptr — получишь double free: умный указатель не знает, что объект уже мёртв.

QWeakPointer как аналог слабой ссылки здесь не поможет — он работает только с QSharedPointer, который в Qt-иерархии использовать нельзя. Для этого есть QPointer<T>, который подписывается на destroyed() и обнуляется сам.

sender() возвращает QObject* — объект, которым уже кто-то владеет. Оборачивать результат в умный указатель — значит воевать с фреймворком.

• В QML ситуация хуже: JS GC может удалить переданный из C++ объект без родителя, не предупредив. Краш случится через непредсказуемое время. Спасает только QQmlEngine::CppOwnership или явный родитель.

QScopedPointer имеет смысл перед std::unique_ptr в одном конкретном случае — QScopedPointerDeleteLater для объектов вроде QNetworkReply, которые нельзя удалять немедленно. В остальном std-аналоги легче и лучше интегрируются с внешними библиотеками.


💡 Решение предлагается в статье в виде правила:

• есть родитель -> сырой указатель,
• нет родителя -> QScopedPointer или std::unique_ptr
• нужно следить за чужим объектом -> только QPointer
• бизнес-логика без QObject -> чистый STL.


✏️ Статья

📍Навигация: ВакансииЗадачиСобесы

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

#линкер_рекомендует
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥223👍210❤‍🔥208203🥱1
🍿 Иерархический 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++ разработчика

#шаблонный_код
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥52🙏2
🍙 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++ разработчика

#константная_правильность
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰3👍2🤔2🥱1
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++ разработчика

#свежак
👍2👏2🙏1🥱1
🗓️ Уже через пару часов стартует вебинар!

Тема:
Как эффективно управлять контекстным окном LLM в мультиагентных системах и не сливать бюджет на токены


Ждем вас сегодня в 19:00 по московскому времени. Не пропустите начало, будет много практики!

👉 Успей занять место
😁1
Forwarded from Библиотека программиста
🔒 Планы hh.ru на 2026: привязка к Госуслугам и запрет накрутки опыта

С 2026 года hh.ru делит соискателей на три категории: верифицированные, «серые» и невидимые. Те, кто не привязал Госуслуги и не подтвердил опыт через ЭТК, рискуют отправлять отклики в пустоту.


Разбираем механику новой системы и даем рабочий план — что делать прямо сейчас, чтобы остаться в игре.

👉 Читать статью

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3👾3🥱2
😎 Топ-вакансий для C++ разработчиков за неделю

C++ red team developer — от 180 000 и до 450 000 ₽ Офис (Санкт-Петербург)

C++ разработчик (CHYT) — Гибрид (Москва, Санкт-Петербург, Минск, Белград)

Senior Rendering engineer C++ в 3D Карту — от 350 000 и до 400 000 ₽ Удалёнка/Гибрид (Санкт-Петербург, Москва)

✍️ Еще больше топовых вакансий — в нашем канале C++ jobs

📍Навигация: ВакансииЗадачиСобесы

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

#буст
👍1😁1
🔥 4 привычки кодеров

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

но, я собрал 4 привычки адептов «чистого кода», (которые обычно все практикуют) 🤡

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

• Упарывание в сложную архитектуру

Сеньоры на ютубе обещают золотые горы, если внедрить микросервисы куда угодно. Итог: получаешь красивый overengineering-проект для мамы и 0 запущенных продуктов в срок, пока конкуренты клепают MVP на коленке.

• Душные споры на ревью
Неплохо, но как итог: ты пишешь полотна текста и тратишь часы на поиск глупой придирки к стилю, потому что банально фокус сместился с реальной задачи на эго.

• Ручная микро-оптимизация
Классика для тех, кто любит алгоритмы из универа. Итог: убиваешь дни жизни и выжимаешь миллисекунды, хотя бизнесу нужен был просто грязный, но рабочий скрипт еще вчера.

Проблема в том, что ни один из этих путей не дает самого главного - скорости и проверки гипотез. Реальному рынку плевать на твой идеальный код за 3 дня. Бизнес предпочтет код от ИИ-агента за 5 минут, который уже завтра начнет приносить деньги.

Хочешь обкатанный на нас лично и 100х учениках метод, как перестать кодить руками и начать делегировать задачи автономным системам?

👉 Заходи сюда, но у нас осталось всего 4 места, набор идет до завтрашнего дня.

P. S. Если интересно еще что-нибудь почитать от меня, то заходите в «Азбуку Айтишника», там я рассказываю об айти-базе, также у меня там есть бесплатный гайд на 15 глав по ии-агентам
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱31😁1
😎 Улучшения 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++ разработчика

#линкер_рекомендует
👍5🔥2😁1
🍙 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++ разработчика

#константная_правильность
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81
📉 Кризис найма в IT: почему Яндекс и Сбер усложняют собеседования вместо того, чтобы их упрощать

Казалось бы, если кандидатов не хватает — надо снижать барьеры. Но крупные игроки делают ровно наоборот: добавляют этапы, тесты и ИИ-оценку. За этим стоит холодная логика: лучше закрывать вакансию дольше, чем нанять человека, который уйдет через полгода. Смотрим, что именно изменилось в Яндексе и Сбере — и работает ли это.

👉 Статья

📍Навигация: ВакансииЗадачиСобесы

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

#буст
😁5
🏆 Задача на выходные: 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++ разработчика

#константная_правильность
Please open Telegram to view this post
VIEW IN TELEGRAM