9Как std::vector управляет capacity, ростом, перевыделением и стабильностью итераторов?
std::vector хранит элементы непрерывно и отслеживает и size, и capacity. size — число сконструированных элементов; capacity — объём выделенного хранилища элементов, доступного до следующего выделения. Когда добавление элементов превысило бы capacity, vector выделяет больший блок, обычно используя определяемую реализацией стратегию геометрического роста, перемещает или копирует существующие элементы, уничтожает старые и освобождает старое хранилище. reserve(n) увеличивает capacity, не меняя size, а resize(n) меняет size, конструируя или уничтожая элементы. Перевыделение инвалидирует все итераторы, ссылки и указатели на элементы; даже без перевыделения операции вроде insert и erase могут инвалидировать позиции в точке изменения и после неё.
Попробовать ответить на вопрос AI-тренеру
10Какие правила инвалидации нужно знать для непрерывных и node-based стандартных контейнеров?
Правила инвалидации зависят от контейнера и операции. Непрерывные контейнеры вроде vector и string имеют хрупкую стабильность итераторов/ссылок: рост может вызвать перевыделение и инвалидировать все итераторы, ссылки и указатели, а insert/erase могут сдвигать элементы и инвалидировать позиции в точке изменения и после неё даже без перевыделения. Упорядоченные node-based контейнеры вроде list, map, set и их multi-вариантов обычно сохраняют итераторы и ссылки на существующие неудалённые элементы при insert; удаление элемента инвалидирует итератор/ссылку на этот удалённый элемент. Неупорядоченные контейнеры тоже хранят элементы в узлах, поэтому ссылки и указатели на элементы в общем случае стабильны при rehash, но rehash инвалидирует итераторы. deque имеет особые правила сегментированного хранения. На практике перед сохранением итераторов или ссылок через модификации нужно проверять конкретный контейнер и операцию.
Попробовать ответить на вопрос AI-тренеру
11Сравните std::map, std::unordered_map и контейнеры в стиле flat-map для lookup-таблиц в бэкенде.
std::map — упорядоченный, обычно древовидный ассоциативный контейнер с логарифмическими lookup/insert/erase; он полезен, когда важны отсортированная итерация, range-запросы или гарантии порядка. std::unordered_map основан на хеш-таблице со средней константной сложностью операций по точному ключу и без упорядоченности ключей; часто это хороший выбор по умолчанию для больших изменяемых lookup-таблиц при качественном хешировании. Контейнер в стиле flat-map хранит отсортированные пары ключ/значение непрерывно, обеспечивая хорошую локальность кэша и быструю итерацию/поиск двоичным поиском, но вставка и удаление в середине линейны. Для lookup-таблиц в бэкенде выбор зависит от того, нужны ли упорядоченность/диапазоны, в основном точные lookup, частые мутации, предсказуемая задержка, накладные расходы по памяти и поведение кэша.
Попробовать ответить на вопрос AI-тренеру
12Объясните std::optional и типичные бэкенд-сценарии представления отсутствующих значений.
std::optional<T> представляет либо содержащееся значение T, либо отсутствие значения. Пустое состояние задаётся std::nullopt; код может проверять has_value() или использовать optional в булевом контексте, получать значение через * или value() и подставлять значение по умолчанию через value_or(). В бэкенд-коде это полезно для nullable-полей БД, необязательных полей запроса/конфигурации, промахов кэша или репозитория, где отсутствие ожидаемо, и доменных состояний, где sentinel вроде -1 или пустой строки был бы неоднозначен. Он моделирует отсутствие значения, а не полиморфизм и не богатую информацию об ошибке.
Попробовать ответить на вопрос AI-тренеру
13Что такое std::string_view и std::span, и какие риски времени жизни создают невладеющие представления (views)?
std::string_view — это невладеющее представление непрерывной последовательности символов; std::span<T> — невладеющее представление непрерывной последовательности элементов типа T. Они полезны для параметров и API буферов без копирования (zero-copy), потому что хранят указатель и длину, не выделяя и не владея памятью. Главная опасность — время жизни: хранилище, на которое ссылается view, должно переживать сам view и не должно инвалидироваться, пока view используется. Возврат или сохранение view на временный объект, локальную переменную, уничтоженный объект или перевыделенный контейнер может оставить «висячий» (dangling) view.
Попробовать ответить на вопрос AI-тренеру