Современный C++ даёт инструменты для более безопасного кода:
std::optional
Хранит “значение или отсутствие значения”.
std::optional<int> try_parse(const std::string& s);
std::variant
Безопасный
union, работающий через типы.variant<int, string> v = "hello";
std::any
Хранит любое значение, но требует приведения типа.
Please open Telegram to view this post
VIEW IN TELEGRAM
Что делает std::visit?
Anonymous Poll
43%
Проверяет variant на тип
57%
Вызывает функцию в зависимости от активного типа
0%
Переводит variant в string
👍4
std::deque — гибрид между std::vector и std::list:
— Быстрые вставки в начало и конец
— Почти такой же быстрый доступ по индексу, как у vector
— Не хранит данные в одном непрерывном блоке
std::deque<int> d = {1, 2, 3};
d.push_front(0);
d.push_back(4);Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
std::string_view — неблокирущий, не владеющий срез строки.
— Дешёвый аргумент, парсер, логирование
void log(std::string_view msg) {
std::cout << msg;
}❗️Частая ошибка:
std::string_view sv = std::string("temp"); // UB🎯 Используйте в сигнатурах вместо const std::string&.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
std::priority_queue<int> q;
q.push(5);
q.push(1);
q.push(10);
std::cout << q.top(); // 10
Особенности:
— Нельзя итерироваться
— Нет erase
— Только top/pop/push
— Доступ только к максимальному элементу
🔑 Если вам нужна структура данных “выдай максимум/минимум” — это ваш выбор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
std::set — дерево
std::unordered_set — хеш-таблица
std::set<int> s;
s.insert(3);
Особенности std::set :
— Сортированные элементы
— Медленнее, но предсказуемо (O(log n))
— Имеет lower_bound/upper_bound
Особенности std::unordered_set
— Быстро — O(1)
— Нет сортировки
— Выгоден для больших объёмов
✅ Если нужно проверить есть ли элемент — std::unordered_set практически всегда быстрее.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🔄 std::transform: функциональный стиль в C++
Преобразует диапазон элемент за элементом
Особенности:
— Применять лямбды к контейнерам
— Копировать с изменением
— Комбинировать два диапазона
⌨️ Если пишете цикл для каждого элемента — почти всегда можно заменить на std::transform.
Преобразует диапазон элемент за элементом
std::vector<int> a = {1,2,3};
std::vector<int> b(3);
std::transform(a.begin(), a.end(), b.begin(), [](int x){ return x * 2; });Особенности:
— Применять лямбды к контейнерам
— Копировать с изменением
— Комбинировать два диапазона
std::transform(a.begin(), a.end(), c.begin(), std::back_inserter(out), std::plus<>{});Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Как сделать очередь с минимальными элементами наверху?
Anonymous Quiz
20%
std::priority_queue<int, vector<int>, greater<int>>
60%
std::priority_queue<int, less<int>>
20%
Никак
👍4
👍4
const int x = 10;
auto a = x;
auto& b = x;
Что здесь происходит?
a — копия, const отброшен
b — ссылка на const int
💡 auto отбрасывает const и ссылку, если они не указаны явно
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
std::string a = "hello";
std::string b = std::move(a);
Многие думают, что a очищается. Это не совсем так...
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
В каком состоянии a после std::move?
Anonymous Quiz
29%
Всегда пустая строка
57%
В неопределённом состоянии
14%
Валидная, но неопределённого значения
0%
Равна "hello"
👍4
void f() {
std::lock_guard<std::mutex> g(m);
throw std::runtime_error("error");
}Please open Telegram to view this post
VIEW IN TELEGRAM
Что произойдёт с mutex?
Anonymous Quiz
20%
Он останется заблокированным
60%
Будет разблокирован
0%
Зависит от компилятора
20%
UB
👍4
struct Base {
~Base() = default;
};
struct Derived : Base {
~Derived() { std::cout << "dtor\n"; }
};
Base* b = new Derived;
delete b;Please open Telegram to view this post
VIEW IN TELEGRAM
Что произойдёт?
Anonymous Quiz
33%
Вызовется Derived::~Derived
0%
Вызовется Base::~Base
67%
UB
0%
Вызовется Derived::~Derived, потом Base::~Base
👍4
std::vector<int> v = {1,2,3};
auto it = v.begin();
v.push_back(4);Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Что с it после push_back?
Anonymous Quiz
17%
Всегда валиден
67%
Может стать невалидным
0%
Всегда инвалидируется
17%
Зависит от размера элемента
👍4
CRTP (Curiously Recurring Template Pattern) — идиома проектирования, при которой шаблон класса принимает производный класс в качестве параметра шаблона
template<typename D>
struct Base
{
void call() { static_cast<D*>(this)->impl(); }
};
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Главное преимущество CRTP?
Anonymous Quiz
17%
Проще читать код
67%
Нет виртуальной таблицы
17%
Работает только с шаблонами
0%
Поддерживает RTTI
👍4