Forwarded from Proglib.academy | IT-курсы
Сегодня хочется разобраться в AI-агентах. Через пару недель появляется задача, где нужны алгоритмы. Потом понимаешь, что неплохо бы освежить Python или математику для Data Science.
В подписку Proglib Academy входят все основные направления — AI, ML, Python, алгоритмы, математика для DS и другие курсы, а ещё закрытый видеохаб с вебинарами практиков.
Начать можно с пробного месяца. Если решите остаться, его стоимость зачтётся при оформлении подписки
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Разберём на вебинаре, как тратить меньше на AI-агентов — без потери качества кода.
— когда дорогая модель действительно нужна, а когда хватит дешёвой;
— сколько стоит один прогон и куда уходят токены;
— какие задачи можно отдавать субагентам;
— как настроить маршрутизацию моделей;
— что проверять в AI-коде перед merge.
Please open Telegram to view this post
VIEW IN TELEGRAM
🧨 Задача: битовое поле, которое лжёт
Сделали компактную структуру флагов. Записали 1, сравниваем с 1 — не сходится. Призраки?
Задача: объясни, почему однобитное знаковое поле хранит не то, что ждёшь, и какое значение реально читается. Как объявить поле правильно?
Сделали компактную структуру флагов. Записали 1, сравниваем с 1 — не сходится. Призраки?
struct Flags { int active : 1; };
int main() {
Flags f;
f.active = 1;
if (f.active == 1)
std::cout << "ok\n"; // не печатает!
}
Задача: объясни, почему однобитное знаковое поле хранит не то, что ждёшь, и какое значение реально читается. Как объявить поле правильно?
❤1
Forwarded from Библиотека программиста
Разбираете урок, слушаете интервью фоном или начинаете на телефоне, а продолжаете на большом экране?
Хотим узнать, что делает просмотр удобным для вас. Вспомните последнее видео — ролик, урок, фильм или серию сериала — и расскажите о своём опыте. Если детали не запомнились, можно так и ответить.
В результатах сможете сравнить свои привычки с ответами других участников. А разработчики и инженеры видеоплатформы расскажут, что происходит по ту сторону экрана, пока вы смотрите видео.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Что сохраняет auto при чтении элемента vector<bool>?
C++20. Что выведет программа?
👾 — 0 0
👍 — 1 1
🥰 — 0 1
⚡️ — Ошибка компиляции
Ответ: 🥰 — 0 1.
snapshot — отдельное значение bool. А auto выводит для proxy тип std::vector<bool>::reference: это объект-посредник, связанный с битом вектора. После изменения flags[0] преобразование proxy в bool даёт true. Вектор не менял размер, поэтому proxy остаётся действительным.
Правило в проекте стандарта C++
Библиотека задач по C++
C++20. Что выведет программа?
#include <iostream>
#include <vector>
int main() {
std::vector<bool> flags{false};
bool snapshot = flags[0];
auto proxy = flags[0];
flags[0] = true;
std::cout << snapshot << ' '
<< static_cast<bool>(proxy);
}
👾 — 0 0
👍 — 1 1
🥰 — 0 1
⚡️ — Ошибка компиляции
snapshot — отдельное значение bool. А auto выводит для proxy тип std::vector<bool>::reference: это объект-посредник, связанный с битом вектора. После изменения flags[0] преобразование proxy в bool даёт true. Вектор не менял размер, поэтому proxy остаётся действительным.
Библиотека задач по C++
👾6🥰4
До 31 октября в Proglib Academy можно выбрать два курса и заплатить только за один.
Например, можно совместить:
💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью.💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений.
Вместе курсы стоят 108 000 ₽, но по акции оба обойдутся в 59 000 ₽. Экономия — 49 000 ₽
Интересуют Python и ИИ или алгоритмы и архитектура? Можно выбрать любые два курса из каталога.
Please open Telegram to view this post
VIEW IN TELEGRAM
Какое значение по умолчанию получит виртуальный метод?
C++20. Что выведет программа?
👾 — Derived 1
👍 — Derived 2
🥰 — Base 1
⚡️ — Ошибка компиляции
Ответ: 👾 — Derived 1.
Виртуальный вызов выбирает реализацию Derived::show. Но аргумент по умолчанию берётся из объявления, доступного через статический тип ref — Base&. Поэтому вызывается Derived::show(1).
Правило в проекте стандарта C++
Библиотека задач по C++
C++20. Что выведет программа?
#include <iostream>
struct Base {
virtual void show(int n = 1) {
std::cout << "Base " << n;
}
};
struct Derived : Base {
void show(int n = 2) override {
std::cout << "Derived " << n;
}
};
int main() {
Derived object;
Base& ref = object;
ref.show();
}
👾 — Derived 1
👍 — Derived 2
🥰 — Base 1
⚡️ — Ошибка компиляции
Виртуальный вызов выбирает реализацию Derived::show. Но аргумент по умолчанию берётся из объявления, доступного через статический тип ref — Base&. Поэтому вызывается Derived::show(1).
Библиотека задач по C++
👾9
Разделяют ли копии mutable-лямбды один счётчик?
C++20. Что выведет программа?
👾 — 1 2 3
👍 — 1 1 1
🥰 — Ошибка компиляции
⚡️ — 1 2 1
Ответ: ⚡️ — 1 2 1.
Захваченный по значению n хранится внутри объекта лямбды. При копировании next создаётся другой объект со своим n, пока равным нулю. mutable разрешает менять этот внутренний счётчик, но не объединяет состояние копий.
Правило в проекте стандарта C++
Библиотека задач по C++
C++20. Что выведет программа?
#include <iostream>
int main() {
auto next = [n = 0]() mutable {
return ++n;
};
auto copy = next;
std::cout << next() << ' ';
std::cout << next() << ' ';
std::cout << copy();
}
👾 — 1 2 3
👍 — 1 1 1
🥰 — Ошибка компиляции
⚡️ — 1 2 1
Захваченный по значению n хранится внутри объекта лямбды. При копировании next создаётся другой объект со своим n, пока равным нулю. mutable разрешает менять этот внутренний счётчик, но не объединяет состояние копий.
Библиотека задач по C++
⚡3👾3
Изменится ли размер map после чтения отсутствующего ключа?
C++20. Что выведет программа?
👾 — 0 0
👍 — 0 1
🥰 — std::out_of_range
⚡️ — Ошибка компиляции
Ответ: 👍 — 0 1.
Если ключ отсутствует, operator[] вставляет новый элемент. Для int со стандартным аллокатором значение инициализируется нулём. Поэтому value равен 0, а в map теперь один элемент. Для поиска без вставки можно использовать find; at для отсутствующего ключа выбросил бы исключение.
Правило в проекте стандарта C++
Библиотека задач по C++
C++20. Что выведет программа?
#include <iostream>
#include <map>
#include <string>
int main() {
std::map<std::string, int> counts;
int value = counts["go"];
std::cout << value << ' '
<< counts.size();
}
👾 — 0 0
👍 — 0 1
🥰 — std::out_of_range
⚡️ — Ошибка компиляции
Если ключ отсутствует, operator[] вставляет новый элемент. Для int со стандартным аллокатором значение инициализируется нулём. Поэтому value равен 0, а в map теперь один элемент. Для поиска без вставки можно использовать find; at для отсутствующего ключа выбросил бы исключение.
Библиотека задач по C++
👍6🥰1
В Proglib Academy действует акция: покупаешь один курс, а второй получаешь в подарок.
Например, можно совместить два направления по работе с ИИ:
💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью.💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений.
А если тебе интереснее Python, алгоритмы, backend или DevOps — выбирай другую пару курсов из каталога.
Акция действует до 31 октября включительно
Please open Telegram to view this post
VIEW IN TELEGRAM
Какой конструктор вызовет std::move для const-объекта?
C++20. Что выведет программа?
👾 — move
👍 — Ошибка компиляции
🥰 — copy
⚡️ — Ничего: сработает устранение копирования
Ответ: 🥰 — copy.
std::move не снимает const: здесь результат имеет тип const Item&&. Его нельзя передать конструктору Item(Item&&), зато конструктор Item(const Item&) подходит. Поэтому создаётся копия. Сам std::move не выполняет перемещение.
Правило в проекте стандарта C++
Библиотека задач по C++
C++20. Что выведет программа?
#include <iostream>
#include <utility>
struct Item {
Item() = default;
Item(const Item&) {
std::cout << "copy";
}
Item(Item&&) {
std::cout << "move";
}
};
int main() {
const Item source;
Item target = std::move(source);
}
👾 — move
👍 — Ошибка компиляции
🥰 — copy
⚡️ — Ничего: сработает устранение копирования
std::move не снимает const: здесь результат имеет тип const Item&&. Его нельзя передать конструктору Item(Item&&), зато конструктор Item(const Item&) подходит. Поэтому создаётся копия. Сам std::move не выполняет перемещение.
Библиотека задач по C++
🥰5
Узнает ли std::size размер массива в параметре функции?
C++20. Скомпилируется ли программа и что выведет?
👾 — Ошибка компиляции
👍 — 4
🥰 — Размер указателя в байтах
⚡️ — 0
Ответ: 👾 — Ошибка компиляции.
В объявлении параметра функции int values[4] корректируется до int* values. Число 4 не делает параметр массивом из четырёх элементов. std::size не умеет узнавать длину по обычному указателю. Чтобы сохранить размер, можно принять массив по ссылке или использовать std::span и его size().
Правило в проекте стандарта C++
Библиотека задач по C++
C++20. Скомпилируется ли программа и что выведет?
#include <iostream>
#include <iterator>
void printSize(int values[4]) {
std::cout << std::size(values);
}
int main() {
int values[4]{1, 2, 3, 4};
printSize(values);
}
👾 — Ошибка компиляции
👍 — 4
🥰 — Размер указателя в байтах
⚡️ — 0
В объявлении параметра функции int values[4] корректируется до int* values. Число 4 не делает параметр массивом из четырёх элементов. std::size не умеет узнавать длину по обычному указателю. Чтобы сохранить размер, можно принять массив по ссылке или использовать std::span и его size().
Библиотека задач по C++
🥰3👾2👍1
Сколько элементов создадут круглые и фигурные скобки?
C++20. Что выведет код?
👾 — 3 3
👍 — 3 2
🥰 — 2 2
⚡️ — 7 2
Ответ: 👍 — 3 2.
Круглые скобки выбирают конструктор «количество и значение»: три семёрки. Фигурные скобки выбирают конструктор с initializer_list: два элемента, 3 и 7.
Документация: выбор конструктора при инициализации списком
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
C++20. Что выведет код?
#include <iostream>
#include <vector>
int main() {
std::vector<int> first(3, 7);
std::vector<int> second{3, 7};
std::cout << first.size() << ' '
<< second.size();
}
👾 — 3 3
👍 — 3 2
🥰 — 2 2
⚡️ — 7 2
Круглые скобки выбирают конструктор «количество и значение»: три семёрки. Фигурные скобки выбирают конструктор с initializer_list: два элемента, 3 и 7.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Что меняют дополнительные скобки в decltype?
C++20. Что выведет код?
👾 — 1 2
👍 — 3 3
🥰 — 3 2
⚡️ — Ошибка компиляции
Ответ: 🥰 — 3 2.
Для имени переменной decltype(n) даёт её объявленный тип — int. Выражение (n) — lvalue, поэтому decltype((n)) даёт int&. Переменная second ссылается на n и меняет его.
Документация: определение типа через decltype
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
C++20. Что выведет код?
#include <iostream>
int main() {
int n = 1;
decltype(n) first = n;
decltype((n)) second = n;
first = 2;
second = 3;
std::cout << n << ' ' << first;
}
👾 — 1 2
👍 — 3 3
🥰 — 3 2
⚡️ — Ошибка компиляции
Для имени переменной decltype(n) даёт её объявленный тип — int. Выражение (n) — lvalue, поэтому decltype((n)) даёт int&. Переменная second ссылается на n и меняет его.
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰3⚡1👍1
Удалит ли release() объект?
C++20. Что выведет код?
👾 — D0
👍 — 1 D
🥰 — Только 0
⚡️ — 0 D
Ответ: ⚡️ — 0 D.
Метод release() возвращает указатель и снимает владение. Сам объект остаётся жив. owner уже пуст, поэтому печатается 0. Деструктор вызывается позже, при delete raw.
Документация: unique_ptr::release
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
C++20. Что выведет код?
#include <iostream>
#include <memory>
struct Item {
~Item() { std::cout << "D"; }
};
int main() {
auto owner = std::make_unique<Item>();
auto raw = owner.release();
std::cout << bool(owner) << ' ';
delete raw;
}
👾 — D0
👍 — 1 D
🥰 — Только 0
⚡️ — 0 D
Метод release() возвращает указатель и снимает владение. Сам объект остаётся жив. owner уже пуст, поэтому печатается 0. Деструктор вызывается позже, при delete raw.
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡10👾2
Останется ли поле живым после reset() владельца?
C++20. Что выведет код?
👾 — 7 1
👍 — 7 0
🥰 — 0 1
⚡️ — Неопределённое поведение
Ответ: 👾 — 7 1.
Указатель part хранит адрес поля, но разделяет владение всем объектом Data. После owner.reset() остаётся один владелец — part. Поэтому объект и его поле продолжают жить.
Документация: aliasing-конструктор shared_ptr
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
C++20. Что выведет код?
#include <iostream>
#include <memory>
struct Data {
int value = 7;
};
int main() {
auto owner = std::make_shared<Data>();
std::shared_ptr<int> part(owner, &owner->value);
owner.reset();
std::cout << *part << ' '
<< part.use_count();
}
👾 — 7 1
👍 — 7 0
🥰 — 0 1
⚡️ — Неопределённое поведение
Указатель part хранит адрес поля, но разделяет владение всем объектом Data. После owner.reset() остаётся один владелец — part. Поэтому объект и его поле продолжают жить.
Please open Telegram to view this post
VIEW IN TELEGRAM
👾3
Почему accumulate теряет дробную часть?
C++20. Что выведет код?
👾 — 4 4
👍 — 3 4
🥰 — 3 3
⚡️ — 0 4
Ответ: 👍 — 3 4.
Начальное значение задаёт тип аккумулятора. С 0 это int: после каждого сложения результат преобразуется в целое число. Получаются сначала 1, затем 3. С 0.0 аккумулятор имеет тип double, и сумма равна 4.
Документация: std::accumulate
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
C++20. Что выведет код?
#include <iostream>
#include <numeric>
#include <vector>
int main() {
std::vector<double> values{1.5, 2.5};
auto first = std::accumulate(
values.begin(), values.end(), 0
);
auto second = std::accumulate(
values.begin(), values.end(), 0.0
);
std::cout << first << ' ' << second;
}
👾 — 4 4
👍 — 3 4
🥰 — 3 3
⚡️ — 0 4
Начальное значение задаёт тип аккумулятора. С 0 это int: после каждого сложения результат преобразуется в целое число. Получаются сначала 1, затем 3. С 0.0 аккумулятор имеет тип double, и сумма равна 4.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2