0Pricing
C++ Academy · Урок

Основы 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 — локальная установка не требуется.

Все уроки этого курса

  1. Массив фиксированного размера std::array
  2. Основы std::span
  3. Передача span в функции
  4. Границы и поддиапазоны
← Назад к C++ Academy