Что это?
В стандарте C++20 появился обобщенный класс — std::span
(заголовок <span>
). Этот класс является частью библиотеки контейнеров, но может быть использован в качестве основы для реализации каких-либо задач в других библиотеках STD. Объект этого класса позволяет получить ссылку на непрерывную последовательность элементов в памяти (последовательный контейнер, Си-массив), но при этом он не будет владеть им, т. е., не сможет копировать или перемещать элементы объекта на который он указывает. Чтобы работа с промежутками была более гибкая, разработчики языка наделили span
возможностью изменять значения элементов исходного объекта. Поэтому промежутки нельзя назвать строгим представлением (view
), в отличие от range::view
.
std::span
от std::strig_view
Польза этого шаблона в том, что использование промежутков позволяет избежать ненужного копирования области памяти при передаче аргументов в функцию. Помимо этого, разработчик получает набор готовых инструментов, в виде стандартных функций шаблонов C++, и единообразное оформление программного кода, в котором реализация рутинных задач будет инкапсулирована, и можно сконцентрироваться на самом важном.
span
, по каким-либо причинам, будет недостаточно, то следует обратиться к библиотеке range
, обладающей более широкими возможностями.