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

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

Open in Telegram

Все самое полезное для плюсовика и сишника в одном канале. Как запустить своего ии-агента: 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 16 867 subscribers, ranking 7 486 in the Technologies & Applications category and 38 903 in the Russia region.

📊 Audience metrics and dynamics

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

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

  • Verification status: Not verified
  • Engagement rate (ER): The average audience engagement rate is 8.43%. Within the first 24 hours after publication, content typically collects N/A% reactions from the total number of subscribers.
  • Post reach: On average, each post receives 1 422 views. Within the first day, a publication typically gains 0 views.
  • Reactions and interaction: The audience actively supports content: the average number of reactions per post is 3.
  • 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 27 August, 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.

16 867
Subscribers
+224 hours
-197 days
-9830 days
Posts Archive
🏆 Задача на выходные: 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

🍴 Умные указатели в Qt: почему new никуда не делся Современный C++ давно говорит «забудь про new». Qt говорит «подожди». Ста
🍴 Умные указатели в 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++ разработчика #линкер_рекомендует

🇷🇺Разбираешься в радиочипах, оптике и связи? Забери до 2 000 000 рублей за свои инженерные навыки на турнире «Дронкон»🇷🇺
🇷🇺Разбираешься в радиочипах, оптике и связи? Забери до 2 000 000 рублей за свои инженерные навыки на турнире «Дронкон»🇷🇺 «Сталинские Соколы» открывают регистрацию на 3-й Всероссийский турнир «Дронкон», который пройдет с 8 по 14 мая. 2 направления для победы: - Инженерное дело: беспроводная связь, радиочипы и оптические системы + стратегия «Битва Дронов»; - Пилотирование: War Thunder, GeoGuessr и FPV-гонки + стратегия «Битва Дронов». Призовой фонд для победителей одной дисциплины: 🥇место – 2 000 000 рублей 🥈место – 1 500 000 рублей 🥉место – 1 000 000 рублей Награда за 4-8 места - 150 000 рублей Пройди заочный онлайн-этап и получи путевку на очный этап турнира в Республику Татарстан! Перелет, питание, проживание - за счет организаторов. 🇷🇺 Подать заявку и узнать подробности 🇷🇺

⚙️ Хотим сделать одну вещь — собрать нормальный список людей, за которыми реально следит C++ сообщество C++ — язык с историей
⚙️ Хотим сделать одну вещь — собрать нормальный список людей, за которыми реально следит C++ сообщество C++ — язык с историей. И у него есть живое сообщество людей, которые двигают его вперёд — через доклады, статьи, открытый код и просто посты в сети. ⁉️ Хотим узнать, кого читаете именно вы Не «обязательный список» — а реальный срез того, за кем следит наш канал. Может, откроем друг другу что-то новое. 📎 Формат простой: • Имя • Где (YouTube, блог, X, GitHub...) • Почему именно он/она 👇 Пишите, собирём в отдельный пост 📍Навигация: ВакансииЗадачиСобесы Библиотека C/C++ разработчика #междусобойчик

🔥 База по ИИ-агентам от научного сотрудника Сколтеха и НИУ ВШЭ Знакомьтесь, Екатерина Трофимова. Кандидат компьютерных наук,
🔥 База по ИИ-агентам от научного сотрудника Сколтеха и НИУ ВШЭ Знакомьтесь, Екатерина Трофимова. Кандидат компьютерных наук, ресерчер в Центре ИИ Сколтеха и лаборатории 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 и начать обучение

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