Основы std::span
Невладеющие представления непрерывных данных
«Основы std::span» — бесплатный урок C++ Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Невладеющее представление
std::span<T> (C++20) — это лёгкое представление непрерывной последовательности, похожее на string_view, но подходящее для элементов любого типа. Подключите <span>.
#include <iostream>
#include <span>
#include <array>
int main() {
std::array<int, 3> a = {1, 2, 3};
std::span<int> s = a;
std::cout << s.size() << "\n";
}Представления span не владеют данными
Представление span хранит указатель и длину; оно наблюдает за данными, которыми владеет другой объект, и никогда не копирует элементы.
#include <iostream>
#include <vector>
#include <span>
int main() {
std::vector<int> v = {5, 6, 7};
std::span<int> s = v;
s[0] = 50; // modifies v
std::cout << v[0] << "\n"; // 50
}Из std::array
Массив автоматически преобразуется в представление span, которое видит все его элементы.
#include <iostream>
#include <span>
#include <array>
int main() {
std::array<int, 4> a = {1, 2, 3, 4};
std::span<int> s{a};
for (int x : s) std::cout << x << " ";
std::cout << "\n";
}Из вектора
std::vector также преобразуется в представление span, обеспечивая единообразный доступ независимо от исходного контейнера.
#include <iostream>
#include <vector>
#include <span>
int main() {
std::vector<int> v = {9, 8, 7};
std::span<int> s = v;
std::cout << s.front() << " " << s.back() << "\n";
}Из указателя и размера
Представление span можно создать из обычного указателя и количества элементов; это удобно для буферов в стиле C.
#include <iostream>
#include <span>
int main() {
int buf[] = {10, 20, 30};
std::span<int> s(buf, 3);
std::cout << s[1] << "\n"; // 20
}Перебор представления span
Представления span поддерживают циклы по диапазону и обычный интерфейс контейнеров (size, front, back, data).
#include <iostream>
#include <span>
int main() {
int buf[] = {2, 4, 6, 8};
std::span<int> s(buf, 4);
int sum = 0;
for (int x : s) sum += x;
std::cout << sum << "\n"; // 20
}Представления только для чтения
std::span<const int> предоставляет доступ только для чтения; используйте его, когда функция не должна изменять данные.
#include <iostream>
#include <span>
int main() {
int buf[] = {1, 2, 3};
std::span<const int> s(buf, 3);
std::cout << s[2] << "\n"; // 3
}Изменение через представление span
Представление span без const может изменять исходные элементы, поскольку указывает на настоящие данные.
#include <iostream>
#include <span>
int main() {
int buf[] = {1, 1, 1};
std::span<int> s(buf, 3);
for (int& x : s) x *= 10;
std::cout << buf[2] << "\n"; // 10
}Динамический и статический размер
По умолчанию представление span имеет динамический размер, но его можно зафиксировать во время компиляции с помощью std::span<int, 3> для дополнительной проверки.
Без выделения памяти, дёшево передавать
Как и любое представление, span дёшево копировать и передавать по значению: он содержит только указатель и длину.
Помните о сроке действия
Представление span действительно только пока существует его источник и его память не перераспределена. Не сохраняйте представление span для вектора, размер которого впоследствии увеличивается.
Быстрая проверка
Проверьте, насколько хорошо Вы поняли std::span.
Итоги
Вы изучили основы std::span:
- Невладеющее представление непрерывных данных (массива, вектора или обычного буфера).
- Хранит указатель и длину; не выполняет копирование и выделение памяти.
- Представления с
constдоступны только для чтения, а изменяемые представления позволяют редактировать источник. - Действительно только пока существует источник.
Часто задаваемые вопросы
Урок «Основы std::span» бесплатный?
Да — полный текст урока «Основы std::span» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Основы std::span»?
Невладеющие представления непрерывных данных Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Основы std::span»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Массив фиксированного размера std::array
- Основы std::span
- Передача span в функции
- Границы и поддиапазоны