Mediumspanc++20

Что такое std::span и зачем?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

std::span<T> (C++20) — не владеющий view на contiguous sequence (ptr + size), аналог string_view для любого типа. Принимает C-array, std::array, std::vector, std::string.

// Один интерфейс для всех contiguous контейнеров, без overhead
void process(std::span<int> data);

int arr[10];
std::vector<int> v;
std::array<int, 10> a;

process(arr);              // все три работают
process(v);
process(a);
process(v.data(), 0);      // ошибка компиляции — нет narrowing
  • overhead — 2 слова (ptr + size), нет аллокации;
  • subspan, first<N>, last<N> — как у string_view;
  • span<T, N> — фиксированный compile-time размер.

Ограничения: только contiguous (не list/deque). Опасность: dangling — если исходный контейнер уничтожен, span висит. Лучше, чем T* + size в API.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.