0Pricing
C++ Academy · Урок

Распространённые стандартные концепции: Integral, Ranges

Используйте концепции стандартной библиотеки, такие как integral и ranges::range.

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

Стандартная библиотека концептов

В C++20 появилось множество стандартных концептов в <concepts> и <ranges>. Знание этих концептов избавляет от необходимости писать собственные.

Концепты основного языка

Фундаментальные концепты:

  • std::same_as<T, U>
  • std::derived_from<T, U>
  • std::convertible_to<T, U>
  • std::common_with<T, U>
  • std::assignable_from<T, U>

Арифметические концепты

Ограничивайте типы числовыми:

  • std::integral — любой целочисленный тип
  • std::signed_integral — знаковый целочисленный тип
  • std::unsigned_integral — беззнаковый целочисленный тип
  • std::floating_point — float, double, long double
template <std::floating_point T>
T mean(T a, T b) { return (a + b) / 2; }

Концепты сравнения

Задавайте ограничения для типов, поддерживающих проверку равенства и упорядочивание:

  • std::equality_comparable
  • std::totally_ordered
  • std::three_way_comparable

Концепты объектов

Распространённые требования:

  • std::movable
  • std::copyable
  • std::default_initializable
  • std::semiregular
  • std::regular
template <std::regular T>
class Container { /* full-fledged value type */ };

Концепты вызываемых объектов

Для функций и функторов:

  • std::invocable<F, Args...>
  • std::regular_invocable<F, Args...>
  • std::predicate<F, Args...>
template <std::invocable<int> F>
void apply_to_42(F&& f) {
    std::forward<F>(f)(42);
}

Концепты итераторов

В <iterator>:

  • std::input_iterator
  • std::forward_iterator
  • std::bidirectional_iterator
  • std::random_access_iterator
  • std::contiguous_iterator

Концепты диапазонов (C++20)

Из <ranges>:

  • std::ranges::range — имеет begin/end
  • std::ranges::view — диапазон, не владеющий данными
  • std::ranges::sized_range — знает свой размер за O(1)
  • std::ranges::random_access_range
template <std::ranges::range R>
auto first(R&& r) {
    return *std::ranges::begin(r);
}

Объединение концептов

Сочетайте концепты, чтобы задавать точные требования.

template <std::ranges::random_access_range R>
    requires std::integral<std::ranges::range_value_t<R>>
auto sum(const R& r) {
    return std::reduce(std::ranges::begin(r), std::ranges::end(r));
}

Пользовательские концепты на основе стандартных

Создавайте предметно-ориентированные концепты на основе стандартных.

template <typename T>
concept Number = std::integral<T> || std::floating_point<T>;

Алгоритмы на основе концептов

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

Краткая памятка

По возможности используйте встроенные концепты:

  • Числа → integral / floating_point
  • Итерация → ranges::range
  • Вызываемые объекты → invocable / predicate
  • Тип значения → regular или semiregular

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

Какой стандартный концепт описывает тип, у которого есть и begin(), и end()?

Итоги

Стандартная библиотека предоставляет богатый набор концептов: арифметические (integral, floating_point), сравнимости (equality_comparable), объектов (movable, regular), вызываемых объектов, итераторов и диапазонов. Используйте их как основу собственных ограничений.

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

Урок «Распространённые стандартные концепции: Integral, Ranges» бесплатный?

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

Чему я научусь в уроке «Распространённые стандартные концепции: Integral, Ranges»?

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

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

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

Сколько времени занимает урок «Распространённые стандартные концепции: Integral, Ranges»?

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

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

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

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

  1. Почему concepts, а не SFINAE
  2. Определение концепций с помощью requires
  3. Концепции в шаблонах и auto
  4. Распространённые стандартные концепции: Integral, Ranges
← Назад к C++ Academy