Библиотека задач по C++ | тесты, код, задания
5.4K subscribers
1.02K photos
6 videos
342 links
Задачи и тесты по C++ для тренировки и обучения.

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

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

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

Для обратной связи: @proglibrary_feeedback_bot
Download Telegram
Сколько символов сохранит строка со встроенным \0?

C++20. Что выведет код?

#include <iostream>
#include <string>

int main() {
std::string first = "A\0B";
std::string second("A\0B", 3);

std::cout << first.size() << ' '
<< second.size();
}


👾 — 3 3
👍 — 1 1
🥰 — 4 3
⚡️ — 1 3

Ответ: ⚡️ — 1 3.

Первый конструктор читает C-строку до первого нулевого символа и сохраняет только A. Во втором длина указана явно: он копирует три символа, включая внутренний \0. Для std::string этот символ может быть частью содержимого.

Документация: конструкторы std::string

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡6
Какая распаковка изменит исходную пару?

C++20. Что выведет код?

#include <iostream>
#include <utility>

int main() {
std::pair<int, int> values{1, 2};

auto [x, y] = values;
auto& [a, b] = values;

x = 5;
a = 7;

std::cout << values.first << ' ' << x;
}


👾 — 7 5
👍 — 1 5
🥰 — 5 5
⚡️ — 7 7

Ответ: 👾 — 7 5.

Объявление с auto создаёт скрытую копию пары: x связан с её первым элементом. Объявление с auto& связывается с исходной парой. Поэтому запись в a меняет values.first, а x сохраняет значение 5.

Документация: структурные связывания

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👾5
👀 Почему optional<bool> с false попадает в ветку if?

C++20. Что выведет код?

#include <iostream>
#include <optional>

int main() {
std::optional<bool> flag = false;
std::cout << (flag ? "yes" : "no") << ' '
<< std::boolalpha << *flag;
}


👾 — no false
👍 — yes false
🥰 — yes true
⚡️ — Ошибка компиляции

Ответ: 👍 — yes false.

В условии optional проверяет, содержит ли он значение. Здесь значение есть, поэтому выбирается yes. Само хранимое значение равно false.

Документация

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
👀 Уменьшит ли std::remove размер vector?

C++20. Что выведет код?

#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>

int main() {
std::vector<int> values{1, 2, 2, 3};
auto end = std::remove(values.begin(), values.end(), 2);
std::cout << values.size() << ' '
<< std::distance(values.begin(), end) << ' ';
values.erase(end, values.end());
std::cout << values.size();
}


👾 — 2 2 2
👍 — 4 4 2
🥰 — 4 2 4
⚡️ — 4 2 2

Ответ: ⚡️ — 4 2 2.

std::remove перемещает сохраняемые элементы в начало диапазона и возвращает его новый логический конец. Размер vector остаётся равным 4. В сохраняемой части два элемента; после erase физический размер тоже становится равным 2.

Документация

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡2❤1
👀 Вычислится ли аргумент try_emplace, если ключ уже есть?

C++20. Что выведет код?

#include <iostream>
#include <map>

int main() {
int calls = 0;
auto build = [&] { ++calls; return 99; };
std::map<int, int> values{{1, 7}};

auto [it, inserted] = values.try_emplace(1, build());
std::cout << calls << ' ' << std::boolalpha
<< inserted << ' ' << it->second;
}


👾 — 1 false 7
👍 — 0 false 7
🥰 — 1 true 99
⚡️ — 0 true 99

Ответ: 👾 — 1 false 7.

build() вычисляется до входа в try_emplace, поэтому calls становится равным 1. Ключ 1 уже есть: вставка не выполняется, а значение 7 сохраняется.

Документация

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👾1
👀 Кому принадлежит объект после захвата unique_ptr в лямбду?

C++20. Что выведет код?

#include <iostream>
#include <memory>
#include <utility>

int main() {
auto ptr = std::make_unique<int>(7);
auto read = [p = std::move(ptr)] { return *p; };

std::cout << std::boolalpha << (ptr == nullptr)
<< ' ' << read();
}


👾 — false 7
👍 — Ошибка компиляции
🥰 — true 7
⚡️ — true 0

Ответ: 🥰 — true 7.

Инициализирующий захват перемещает unique_ptr в поле объекта-замыкания. Исходный ptr становится пустым, а лямбда владеет объектом и возвращает хранимую семёрку.

Документация

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰7❤1
👀 Увидит ли string_view изменение символа исходной строки?

C++20. Что выведет код?

#include <iostream>
#include <string>
#include <string_view>

int main() {
std::string text = "code";
std::string copy = text;
std::string_view view = text;

text[0] = 'm';
std::cout << copy << ' ' << view;
}


👾 — mode mode
👍 — code mode
🥰 — code code
⚡️ — Неопределённое поведение

Ответ: 👍 — code mode.

copy хранит отдельную копию строки. view ссылается на символы text и видит замену c на m. Исходная строка остаётся живой, её размер не меняется, поэтому представление действительно.

Документация

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
👀 Что вернёт std::exchange и что останется в переменной?

C++20. Что выведет код?

#include <iostream>
#include <utility>

int main() {
int value = 7;
int previous = std::exchange(value, 0);
std::cout << previous << ' ' << value;
}


👾 — 0 7
👍 — 7 7
🥰 — 0 0
⚡️ — 7 0

Ответ: ⚡️ — 7 0.

std::exchange сохраняет старое значение value, присваивает переменной новое значение 0 и возвращает сохранённую семёрку.

Документация

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡4
👀 Какой кортеж изменит исходную переменную?

C++20. Что выведет код?

#include <functional>
#include <iostream>
#include <tuple>

int main() {
int x = 1;
auto a = std::make_tuple(x);
auto b = std::make_tuple(std::ref(x));
std::get<0>(a) = 5;
std::get<0>(b) = 9;
std::cout << x << ' ' << std::get<0>(a);
}


👾 — 1 5
👍 — 9 9
🥰 — 9 5
⚡️ — Ошибка компиляции

Ответ: 🥰 — 9 5.

make_tuple(x) сохраняет копию числа. При передаче std::ref(x) получается кортеж с элементом int&, связанным с x. Поэтому запись через b меняет x, а элемент a остаётся равным 5.

Документация

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰4
👀 Скопирует ли std::span элементы массива?

C++20. Что выведет код?

#include <iostream>
#include <span>

int main() {
int a[] = {10, 20, 30};
std::span<int> view(a);
auto part = view.subspan(1, 2);
part[0] = 99;
std::cout << a[0] << ' ' << a[1] << ' ' << a[2];
}


👾 — 10 99 30
👍 — 10 20 30
🥰 — 99 20 30
⚡️ — Ошибка компиляции

Ответ: 👾 — 10 99 30.

span хранит представление существующих элементов. subspan начинает участок с a[1]. Запись в part[0] меняет именно этот элемент массива.

Документация

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👾2
💥 Три IT-курса по цене одного — только до 15 ноября!

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

В Proglib Academy можно забрать такую комбинацию для мощной прокачки за 45 990 ₽:

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

🐍 Python — для практического программирования, автоматизации и дальнейшего развития в Data Science и AI.

📐 Математика для AI — для понимания математической основы машинного обучения и работы моделей.


➡️ Забирайте три курса, которые лучше всего дополняют ваши текущие знания и профессиональные цели⚡️

Успевайте до 15 ноября включительно 🎁
Please open Telegram to view this post
VIEW IN TELEGRAM
👀 Можно ли поменять ключ map через извлечённый узел?

C++20. Какие ключи напечатает программа?

#include <iostream>
#include <map>

int main() {
std::map<int, int> m{{1, 10}, {2, 20}};
auto node = m.extract(1);
node.key() = 3;
m.insert(std::move(node));
for (const auto& [key, value] : m)
std::cout << key << ' ';
}


👾 — 1 2
👍 — 1 2 3
🥰 — Ошибка компиляции
⚡️ — 2 3

Ответ: ⚡️ — 2 3.

extract извлекает узел из map. У извлечённого узла ключ доступен для изменения через key(). После вставки map содержит ключи 2 и 3 и обходит их по возрастанию.

Документация

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡2
👀 Что вернёт get_if для неактивного типа variant?

C++20. Что произойдёт при запуске?

#include <iostream>
#include <string>
#include <variant>

int main() {
std::variant<int, std::string> v = 7;
auto* text = std::get_if<std::string>(&v);
auto* number = std::get_if<int>(&v);
std::cout << std::boolalpha << (text == nullptr)
<< ' ' << *number;
}


👾 — false 7
👍 — true 7
🥰 — Исключение bad_variant_access
⚡️ — Ошибка компиляции

Ответ: 👍 — true 7.

Сейчас variant хранит int. get_if<string> возвращает nullptr, а get_if<int> — указатель на число 7. Проверка text не разыменовывает нулевой указатель.

Документация

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM