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

Как запустить своего ии-агента: https://clc.to/tvpmDQ

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

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

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

#WXSSA
Download Telegram
🔥 Инженерная методичка по ИИ от Романа Барлоса (Team Lead в Yandex Cloud)

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

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

🛠️ Полезные инструменты:
Understand Anything — граф знаний по коду и зависимостям.
DeepTutor — open-source платформа для персонализированного обучения.
Superpowers — набор практик для системной разработки с ИИ.
Awesome Agent Skills — коллекция навыков для ИИ-агентов.


📚 Ключевые работы по LLM:
Attention Is All You Need (2017) — архитектура Transformer.
GPT-1 (2018) — начало эпохи GPT.
GPT-2 (2019) — решение новых задач без дообучения.
GPT-3 (2020) — обучение на примерах из запроса.
InstructGPT (2022) — RLHF и современные чат-боты.


На курсе Роман выступает консультантом программы: помогает формировать содержание уроков с опорой на актуальные инженерные практики».

Занять свое место на потоке:

👉 Курс «Разработка ИИ-агентов»
😁21
🥳 Алгоритмы диапазонов: Свёртки (fold)

В прошлый раз модифицировали диапазоны — теперь сворачиваем их в одно значение. В C++23 появилось семейство fold_*, которое наконец заменяет std::accumulate и аккуратно выводит типы.


🍰 ranges::fold_left — свёртка слева

std::vector<int> v = {1, 2, 3, 4, 5};
int sum = std::ranges::fold_left(v, 0, std::plus{}); // 15
int product = std::ranges::fold_left(v, 1, std::multiplies{}); // 120


Левоассоциативная свёртка: аккумулятор — левый аргумент операции, элемент — правый. По шагам это (((( 0+1 )+2 )+3 )+4 )+5. Начальное значение задаёте сами.


🥨 ranges::fold_left_first — первый элемент как начало

std::vector<int> v = {3, 1, 4, 1, 5};
auto max_val = std::ranges::fold_left_first(v, [](int a, int b){
return std::max(a, b);
});
// max_val == std::optional<int>{5}


То же самое, но начальным значением берётся первый элемент диапазона — отдельный init не нужен. Удобно для max/min, где придумывать «нейтральный» элемент неловко (Для готовых max/min, конечно, есть ranges::max — fold_left_first интересен произвольной операцией).

❗️ Возвращает std::optional: у пустого диапазона нет первого элемента, поэтому на пустом входе придёт std::nullopt. Не забудьте проверить перед разыменованием.


🥖 ranges::fold_right — свёртка справа

std::vector<int> v = {1, 2, 3};
int r = std::ranges::fold_right(v, 0, std::minus{});
// 1 - (2 - (3 - 0)) == 2
int l = std::ranges::fold_left(v, 0, std::minus{});
// ((0 - 1) - 2) - 3 == -6


Идёт с правого конца: result = f(1, f(2, f(3, 0))). Для коммутативных операций (plus, multiplies) результат совпадёт с fold_left, а для некоммутативных — нет, как видно по вычитанию.

❗️ У fold_right порядок аргументов операции зеркальный: вызывается f(элемент, аккумулятор), то есть элемент идёт первым, а не вторым. Для своих лямбд это легко перепутать.


🥯 ranges::fold_right_last — последний элемент как начало

std::vector<int> v = {1, 2, 3};
auto res = std::ranges::fold_right_last(v, std::minus{});
// 1 - (2 - 3) == 2, внутри std::optional<int>{2}


Зеркало fold_left_first: начальным значением берётся последний элемент, результат — тоже std::optional с тем же поведением на пустом диапазоне.


🧇 ranges::fold_left_with_iter — результат и итератор

std::vector<int> v = {1, 2, 3, 4, 5};
auto [in, value] = std::ranges::fold_left_with_iter(v, 0, std::plus{});
// value == 15
// in == v.end()


Возвращает не просто значение, а структуру с полями in (итератор конца обработки) и value. Полезно, когда после свёртки нужно знать, где именно остановились — например, при работе с подсчётами в потоке.


❗️ Несколько подводных камней

• Главное отличие от accumulate — в том, как выводится тип накопления. У accumulate тип аккумулятора равен типу init, поэтому std::accumulate(vd.begin(), vd.end(), 0) на векторе double молча копит в int и теряет дробную часть. А fold_left выводит тип аккумулятора из РЕЗУЛЬТАТА операции (U = decay_t<invoke_result_t<F&, T, range_reference_t<R>>>), и здесь int-ный ноль на векторе double уже ничего не теряет: plus(int, double) даёт double, и всё копится в double.

std::vector<double> vd = {1.5, 2.5, 3.0};
auto s = std::ranges::fold_left(vd, 0, std::plus{});
// s == 7.0, а НЕ 6 — тип s выведен как double
// (то же самое через accumulate с init 0 дало бы int 6)


Это и есть причина, по которой fold_left лучше: он не обрезает молча.

fold_left довольствуется однопроходным input-диапазоном (годится для istream_view и прочих потоков), а fold_right требует bidirectional-диапазона — ему нужно дойти до конца и пойти обратно. Поэтому «свернуть справа» поток на лету не выйдет.

• В отличие от remove, transform и copy_if из прошлого поста, свёртки НЕ принимают проекцию. «Свернуть по полю» одним аргументом не выйдет — нужна лямбда, которая сама достанет нужное:

std::vector<Task> tasks = { {"Код", 1}, {"Деплой", 2} };
int total = std::ranges::fold_left(tasks, 0,
[](int acc, const Task& t){ return acc + t.priority; });
// 3



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

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

#константная_правильностьx
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍3👾1
📉 Инфляция грейдов, смерть джунов, новая модель найма: что происходит с IT-рынком в 2026 году

Представь лифт, который застрял между этажами, а его двери завалили арматурой. Это и есть IT-рынок в 2026 году. Грейды ничего не значат, джунов не берут, кандидаты врут в резюме, компании завышают требования, а воронку найма пересобирают с нуля. Разбираемся, что пошло не так и как это чинят.

👉 Читать дальше

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

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

#свежак
😁4👍1
⛄️ Почему find_package(Foo) ищет в двух режимах?

Многие думают, что find_package — это «одна команда, один поиск». На деле под капотом работает диспетчер двух разных механизмов, и путаница между ними — частая причина «package not found» при идеально установленной библиотеке.

🔍 Когда вы пишете find_package(Foo), CMake по умолчанию сначала запускает Module mode: ищет файл FindFoo.cmake сперва в CMAKE_MODULE_PATH, а затем во встроенных модулях самого CMake. Это скрипт-разведчик, который через find_path/find_library сам ищет заголовки и библиотеки на диске.

⚡️ Если модуль не найден, включается Config mode: CMake ищет FooConfig.cmake или foo-config.cmake — файл, который поставляет сам пакет и который точно знает, где что лежит.

❗️ Важно: это последовательный поиск с откатом, а не параллельный. И порядок можно перевернуть — с CMake 3.15 переменная CMAKE_FIND_PACKAGE_PREFER_CONFIG=ON заставляет сначала пробовать Config.

find_package(Foo)              # сначала Module, потом Config
find_package(Foo CONFIG) # только Config mode
find_package(Foo MODULE) # только Module mode


❗️ Ключевое различие: FindFoo.cmake пишет кто угодно, кроме автора пакета — потребитель, сторонний разработчик или сами разработчики CMake (так поставляются FindThreads, FindOpenSSL и т.д.), и он угадывает расположение. А FooConfig.cmake поставляет сам автор библиотеки, и он обычно отдаёт готовые импортированные таргеты (Foo::Foo) с уже прописанными путями, флагами и зависимостями. Поэтому Config mode почти всегда надёжнее.

💡 На практике: если современная библиотека (через install(EXPORT)) не находится — проверьте не CMAKE_MODULE_PATH, а CMAKE_PREFIX_PATH, потому что искать нужно именно Config-файл.


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

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

#под_капотом
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍2
✈️ C++26 наводит порядок в строковых литералах

До C++26 строки, которые живут только на этапе компиляции, формально не отличались от обычных литералов — и компиляторы обрабатывали их кто во что горазд.

• P2361R6 выделяет невычисляемые строки — те, что нужны только компилятору (static_assert, [[deprecated]], [[nodiscard]], _Pragma, #line, asm, имена литеральных операторов) и в исполняемый файл не попадают

• Префикс кодировки (L, u8, u, U) на них теперь запрещён: static_assert(false, L"плохо") перестаёт компилироваться

• Строка не переводится в целевую кодировку — компилятор хранит исходные символы как есть, для сообщений об ошибках

• Из управляющих последовательностей остаются только имена символов Юникода и простые вроде \n и \t. Числовые (\x1B, \077) запрещены: в неизвестной кодировке толковать их нечем

• Второй документ, P1854R4, наводит порядок в обычных литералах: непредставимые символы теперь ошибка, а не поведение на усмотрение реализации. И это исправление действует задним числом — вплоть до C++98

Формально это breaking changes. Но проверка более 90 миллионов строк открытого кода почти не нашла затронутых мест: единственные префиксы на таких строках обнаружились в тестах самого Clang. Цена миграции близка к нулю, выигрыш — предсказуемое поведение вместо зоопарка реализаций.

↗️ Пост

✏️ Натыкались ли вы хоть раз на L"..." в static_assert, или это чистка стандарта ради самой чистоты? 👇

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

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🙏6😁2👍1
🐸 Подборка вакансий для C++-разработчиков за неделю

Инженер-программист (C++/Python) — от 250 000 ₽ Гибрид (Москва)

C++ Game Developer / Legacy Game Project — от 1000 и до 2000 $ Удалёнка

Разработчик C++ (Middle) — Офис (Москва)|

Разработчик С++ — Удалёнка


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

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

#вакансии
🔥 Строишь ИИ-агентов? Руководитель AI/ML-направления Сloud․ru покажет, где большинство архитектур ломаются, и как этого избежать.

18 июня в 19:00 совместно с Сloud․ru проведём открытый урок «Мультиагентные системы: почему большинство архитектур переусложнены».

Спикер — Дмитрий Юдин, эксперт по масштабированию и оптимизации вычислительных ресурсов для ML. Под его руководством развивается Evolution AI Factory — цифровая среда для работы с GenAI. Он занимается развитием сервисов генеративного ИИ, инфраструктуры для обучения больших языковых моделей и внедрением интеллектуальных агентов.

Что получишь на уроке:

— критерии выбора между одним агентом и мультиагентной системой;
— разбор популярных архитектурных ошибок;
— реальные ограничения современных ИИ-агентов;
— практические рекомендации по проектированию агентных систем.

🎁 Для участников урока подготовили промокод на скидку 10 000 ₽.

🗓️ Когда: 18 июня, 19:00 (МСК)

👉 Занять место на открытом уроке
😁2
💰 Вас уже развели: 6 способов манипуляции зарплатами в 2026 году

Широкие вилки, которые никто не получает, бонусы-призраки и грейды из параллельной вселенной — рассказываем, как компании в 2026 году экономят на вас, пока вы думаете, что это нормально. Спойлер: если вы хоть раз слышали «пересмотрим через полгода», то вас уже развели.

👉 Читать дальше

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

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

#свежак
👍2
🐛 Задача на выходные: есть ли проблема с deducing this?

C++23 «explicit object parameter» — мощь. Решили сделать zero-overhead геттер с идеальным пробросом самого объекта. На лайвах работает, в проде иногда мусор в строке.

struct Widget {
std::string name;
// отдаём name с тем же value-category, что и сам объект
auto&& title(this auto&& self) {
return std::forward<decltype(self)>(self).name;
}
};

const std::string& bad = Widget{"btn"}.title(); //
std::println("{}", bad);


Задача: объясни, какой ровно тип выводится у title() при вызове на rvalue Widget, почему bad ссылается на уничтоженный объект, и где здесь lifetime extension НЕ срабатывает (и почему именно для deducing-this это особенно коварно). Как спроектировать API, чтобы компилятор ловил это?

💬 Разбор — в комменты

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

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

#междусобойчик
💻 3 курса по цене одного — собери стек для оффера в топовую IT-компанию

Для следующего карьерного шага мало писать код. Работодатели ждут не только знания языка, но и понимания архитектуры, алгоритмов, автоматизации, AI-инструментов и агентных систем.

Одно направление закрывает только часть задачи.

Поэтому сейчас мы предлагаем освоить сразу несколько востребованных навыков — выбери любой курс и получи доступ еще к двум бесплатно 🔥

Собери стек навыков под свою цель:

🔹 подготовка к сильным компаниям (алгоритмы, архитектура);
🔹 переход в AI-направление (ИИ-агенты, AgentOps);
🔹 развитие в ML и Data Science (математика, основы ML);
🔹 новый оффер и рост дохода.

Полученные знания применяешь в работе уже во время обучения.

Акция действует 48 часов — 13 и 14 июня.

👉 Переходи на сайт, выбирай курсы и оставляй заявку — за 10 минут поможем собрать комплект под твою цель.
📰 Свеженькое из мира C++

Подготовили подборку самых интересных материалов за неделю о разных аспектах программирования и интересных проектах в мире C++.

😎 Интересное:

Инфляция грейдов, смерть джунов — смотрим что происходит с IT-рынком в 2026 году
Почему find_package(Foo) ищет в двух режимах? — разбираемся где на самом деле CMake ищет пакеты

C++26 наводит порядок в строковых литералах — новый стандарт приносит нам улучшение строк 😊
Вас уже развели: 6 способов манипуляции зарплатами в 2026 году — хитрости, которые позволяют экономить на сотрудниках

📙 Ranges:

Алгоритмы диапазонов: Свёртки (fold)

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

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

#свежак