0Pricing
C++ Academy · Урок

Введение в библиотеку диапазонов C++20

Используйте алгоритмы std::ranges, принимающие диапазоны вместо пар итераторов.

«Введение в библиотеку диапазонов C++20» — бесплатный урок C++ Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.

Зачем нужны диапазоны

Традиционный STL принимает пары итераторов (v.begin(), v.end()). Диапазоны C++20 принимают одно значение диапазона и добавляют возможность композиции.

Подключение диапазонов

Подключите <ranges>. Пространство имён std::ranges предназначено для алгоритмов, а std::views — для ленивых представлений.

#include <ranges>
#include <algorithm>

Алгоритмы диапазонов

У каждого стандартного алгоритма есть вариант для диапазонов, принимающий диапазон вместо двух итераторов.

std::vector<int> v = {3, 1, 4, 1, 5};
std::ranges::sort(v);             // sort the whole range
auto it = std::ranges::find(v, 4);

Функции проекции

Алгоритмы диапазонов принимают необязательную проекцию — функцию, применяемую к каждому элементу перед сравнением. Это избавляет от необходимости писать пользовательские компараторы.

struct Person { std::string name; int age; };
std::vector<Person> people;
std::ranges::sort(people, {}, &Person::age);
// sort by age, default comparison

Что такое диапазон

Диапазоном является всё, что поддерживает begin() и end(). Это могут быть контейнеры, массивы и в C++20 любой пользовательский тип, предоставляющий сентинел.

Сентинелы

C++20 обобщает end() до сентинела, который не обязан иметь тот же тип, что и итератор. Это полезно для входных потоков и бесконечных диапазонов.

Представления: ленивые конвейеры диапазонов

Представление — это не владеющий диапазон, выдающий элементы по требованию. Объединяйте представления с помощью оператора конвейера |.

auto squares = v
    | std::views::filter([](int x) { return x % 2 == 0; })
    | std::views::transform([](int x) { return x * x; });

for (int x : squares) std::cout << x << " ";

Ленивое вычисление

Представления не выделяют память и не выполняются до начала перебора. filter | transform | take(5) выдаёт только первые 5 преобразованных значений — и ничего больше.

Заимствованные диапазоны и срок жизни

Представления заимствуют исходный диапазон. Если исходный диапазон уничтожен, представление становится висячим. Будьте осторожны с представлениями над временными объектами, хотя C++20 добавил защитные механизмы.

Немедленное и ленивое вычисление

Алгоритмы немедленно создают результаты. Представления выполняют вычисления во время перебора. Выбирайте подход в зависимости от того, нужен ли Вам сформированный результат.

Производительность

Ленивые конвейеры не создают промежуточные контейнеры. Компилятор часто оптимизирует конвейеры так, будто это один цикл. Проверьте результат с помощью godbolt.

Путь миграции

Если Вы не можете использовать C++20, библиотеки вроде range-v3 от Eric Niebler предоставляют ту же модель в C++14/17. Изучить её сейчас стоит, чтобы упростить последующий переход.

Быстрая проверка

Каково главное преимущество диапазонов C++20 перед стилем STL с парами итераторов?

Итоги

Диапазоны C++20 модернизируют алгоритмы STL: принимайте один диапазон, используйте проекции и создавайте ленивые конвейеры с представлениями. Оператор конвейера объединяет фильтры, преобразования и операции выбора количества в понятный декларативный код.

Часто задаваемые вопросы

Урок «Введение в библиотеку диапазонов C++20» бесплатный?

Да — полный текст урока «Введение в библиотеку диапазонов C++20» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.

Чему я научусь в уроке «Введение в библиотеку диапазонов C++20»?

Используйте алгоритмы std::ranges, принимающие диапазоны вместо пар итераторов. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C++ Academy?

Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Введение в библиотеку диапазонов C++20»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C++ Academy?

Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

  1. Категории итераторов: input, forward, bidirectional, random
  2. Распространённые шаблоны итераторов: begin, end, advance
  3. Введение в библиотеку диапазонов C++20
  4. Адаптеры диапазонов: views::filter, transform, take
← Назад к C++ Academy