Mediumc++17optional
Что такое std::optional и когда его использовать?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
std::optional<T> (C++17) — значение, которое может быть, а может не быть. Альтернатива sentinel-значениям (-1, nullptr) или исключениям. Внутри: хранилище для T + bool флаг, без динамической аллокации.
std::optional<int> find(const std::vector<int>& v, int x) {
for (size_t i = 0; i < v.size(); ++i)
if (v[i] == x) return i;
return std::nullopt;
}
auto r = find(data, 42);
if (r) std::cout << *r; // доступ к значению
int v = r.value_or(-1); // значение или дефолт
// r.value(); // бросает bad_optional_access, если пустоПрименять для функций, которые могут «неудачно завершиться» без исключения: парсинг строки в число, поиск в коллекции, запрос к кэшу; для полей класса, инициализируемых позже.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.